[libvirt] [RFC PATCH 08/12] lib: Add API for setting the threshold size for VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD

Peter Krempa pkrempa at redhat.com
Thu Feb 23 19:22:01 UTC 2017


The new API can be used to configure the threshold when
VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD should be fired.
---
 include/libvirt/libvirt-domain.h |  5 ++++
 src/driver-hypervisor.h          |  8 +++++++
 src/libvirt-domain.c             | 51 ++++++++++++++++++++++++++++++++++++++++
 src/libvirt_public.syms          |  1 +
 src/remote/remote_driver.c       |  1 +
 src/remote/remote_protocol.x     | 17 +++++++++++++-
 src/remote_protocol-structs      |  7 ++++++
 7 files changed, 89 insertions(+), 1 deletion(-)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 892cf2cc5..7752cd38c 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -4564,4 +4564,9 @@ int virDomainSetVcpu(virDomainPtr domain,
                      int state,
                      unsigned int flags);

+int virDomainSetBlockThreshold(virDomainPtr domain,
+                               const char *dev,
+                               unsigned long long threshold,
+                               unsigned int flags);
+
 #endif /* __VIR_LIBVIRT_DOMAIN_H__ */
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index b81420aef..3053d7ae8 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -1257,6 +1257,13 @@ typedef int
                        int state,
                        unsigned int flags);

+typedef int
+(*virDrvDomainSetBlockThreshold)(virDomainPtr domain,
+                                 const char *dev,
+                                 unsigned long long threshold,
+                                 unsigned int flags);
+
+
 typedef struct _virHypervisorDriver virHypervisorDriver;
 typedef virHypervisorDriver *virHypervisorDriverPtr;

@@ -1496,6 +1503,7 @@ struct _virHypervisorDriver {
     virDrvDomainGetGuestVcpus domainGetGuestVcpus;
     virDrvDomainSetGuestVcpus domainSetGuestVcpus;
     virDrvDomainSetVcpu domainSetVcpu;
+    virDrvDomainSetBlockThreshold domainSetBlockThreshold;
 };


diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 619a9fccb..93ebe1e86 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -11797,3 +11797,54 @@ virDomainSetVcpu(virDomainPtr domain,
     virDispatchError(domain->conn);
     return -1;
 }
+
+
+/**
+ * virDomainSetBlockThreshold:
+ * @domain: pointer to domain object
+ * @dev: string specifying the block device or backing chain element
+ * @threshold: threshold in bytes when to fire the event
+ * @flags: currently unused, callers should pass 0
+ *
+ * Set the threshold level for delivering the
+ * VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD if the device or backing chain element
+ * described by @dev is written beyond the set threshold level. The threshold
+ * level is unset once the event fired. The event may not be delivered at all if
+ * libvirtd was not running at the moment when the threshold was reached.
+ *
+ * This event allows to use thin-provisioned storage which needs management
+ * tools to grow it without the need for polling of the data.
+ *
+ * Returns 0 if the operation has started, -1 on failure.
+ */
+int
+virDomainSetBlockThreshold(virDomainPtr domain,
+                           const char *dev,
+                           unsigned long long threshold,
+                           unsigned int flags)
+{
+    VIR_DOMAIN_DEBUG(domain, "dev='%s' threshold=%llu flags=%x",
+                     NULLSTR(dev), threshold, flags);
+
+    virResetLastError();
+
+    virCheckDomainReturn(domain, -1);
+    virCheckReadOnlyGoto(domain->conn->flags, error);
+
+    virCheckNonNullArgGoto(dev, error);
+
+    if (domain->conn->driver->domainSetBlockThreshold) {
+        int ret;
+        ret = domain->conn->driver->domainSetBlockThreshold(domain, dev,
+                                                            threshold, flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(domain->conn);
+    return -1;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 04ef58021..428cf2e19 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -755,6 +755,7 @@ LIBVIRT_3.0.0 {

 LIBVIRT_3.1.0 {
     global:
+        virDomainSetBlockThreshold;
         virDomainSetVcpu;
 } LIBVIRT_3.0.0;

diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index efa47beaf..baa5cbab3 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -8436,6 +8436,7 @@ static virHypervisorDriver hypervisor_driver = {
     .domainGetGuestVcpus = remoteDomainGetGuestVcpus, /* 2.0.0 */
     .domainSetGuestVcpus = remoteDomainSetGuestVcpus, /* 2.0.0 */
     .domainSetVcpu = remoteDomainSetVcpu, /* 3.1.0 */
+    .domainSetBlockThreshold = remoteDomainSetBlockThreshold, /* 3.1.0 */
 };

 static virNetworkDriver network_driver = {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 39dd2b728..87b2bd365 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3402,6 +3402,14 @@ struct remote_secret_event_value_changed_msg {
     remote_nonnull_secret secret;
 };

+struct remote_domain_set_block_threshold_args {
+    remote_nonnull_domain dom;
+    remote_nonnull_string dev;
+    unsigned hyper threshold;
+    unsigned int flags;
+};
+
+
 /*----- Protocol. -----*/

 /* Define the program number, protocol version and procedure numbers here. */
@@ -6048,6 +6056,13 @@ enum remote_procedure {
      * @generate: both
      * @acl: none
      */
-    REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD = 385
+    REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD = 385,
+
+    /**
+     * @generate: both
+     * @acl: domain:write
+     */
+    REMOTE_PROC_DOMAIN_SET_BLOCK_THRESHOLD = 386
+

 };
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 67e43a4ac..a46fe37bf 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -2840,6 +2840,12 @@ struct remote_secret_event_value_changed_msg {
         int                        callbackID;
         remote_nonnull_secret      secret;
 };
+struct remote_domain_set_block_threshold_args {
+        remote_nonnull_domain      dom;
+        remote_nonnull_string      dev;
+        uint64_t                   threshold;
+        u_int                      flags;
+};
 enum remote_procedure {
         REMOTE_PROC_CONNECT_OPEN = 1,
         REMOTE_PROC_CONNECT_CLOSE = 2,
@@ -3226,4 +3232,5 @@ enum remote_procedure {
         REMOTE_PROC_SECRET_EVENT_VALUE_CHANGED = 383,
         REMOTE_PROC_DOMAIN_SET_VCPU = 384,
         REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD = 385,
+        REMOTE_PROC_DOMAIN_SET_BLOCK_THRESHOLD = 386,
 };
-- 
2.11.1




More information about the libvir-list mailing list