]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: monitor: Add support for BLOCK_WRITE_THRESHOLD event
authorPeter Krempa <pkrempa@redhat.com>
Wed, 22 Feb 2017 15:52:22 +0000 (16:52 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 27 Mar 2017 07:29:57 +0000 (09:29 +0200)
The event is fired when a given block backend node (identified by the
node name) experiences a write beyond the bound set via
block-set-write-threshold QMP command. This wires up the monitor code to
extract the data and allow us receiving the events and the capability.

16 files changed:
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
tests/qemucapabilitiesdata/caps_2.6.0.ppc64le.xml
tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml

index 8bd39c729b6b28f463962ead8e16ba98a2f0f086..763d15684b4b0e010224f08583fa008ecd19ed04 100644 (file)
@@ -363,6 +363,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               "pcie-root-port",
 
               "query-cpu-definitions", /* 250 */
+              "block-write-threshold",
     );
 
 
@@ -1534,6 +1535,7 @@ struct virQEMUCapsStringFlags virQEMUCapsEvents[] = {
     { "MIGRATION", QEMU_CAPS_MIGRATION_EVENT },
     { "VSERPORT_CHANGE", QEMU_CAPS_VSERPORT_CHANGE },
     { "DEVICE_TRAY_MOVED", QEMU_CAPS_DEVICE_TRAY_MOVED },
+    { "BLOCK_WRITE_THRESHOLD", QEMU_CAPS_BLOCK_WRITE_THRESHOLD },
 };
 
 struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
index 55777f979b210c803b0dd2a62ebf32cd9f44caa6..ac732f3aee66d815f11a832ac645bacf2f98f358 100644 (file)
@@ -399,6 +399,7 @@ typedef enum {
 
     /* 250 */
     QEMU_CAPS_QUERY_CPU_DEFINITIONS, /* qmp query-cpu-definitions */
+    QEMU_CAPS_BLOCK_WRITE_THRESHOLD, /* BLOCK_WRITE_THRESHOLD event */
 
     QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
index 8889eae8265a2ce0af7cb9a8d51e75ef460dacfb..a85eacfee4c81f247fdb9b96b6ab6887a3d21eec 100644 (file)
@@ -1604,6 +1604,24 @@ qemuMonitorEmitAcpiOstInfo(qemuMonitorPtr mon,
 }
 
 
+int
+qemuMonitorEmitBlockThreshold(qemuMonitorPtr mon,
+                              const char *nodename,
+                              unsigned long long threshold,
+                              unsigned long long excess)
+{
+    int ret = -1;
+
+    VIR_DEBUG("mon=%p, node-name='%s', threshold='%llu', excess='%llu'",
+              mon, nodename, threshold, excess);
+
+    QEMU_MONITOR_CALLBACK(mon, ret, domainBlockThreshold, mon->vm,
+                          nodename, threshold, excess);
+
+    return ret;
+}
+
+
 int
 qemuMonitorSetCapabilities(qemuMonitorPtr mon)
 {
index b23a98b3b574eda9c59a47e975aff9849d9ede3b..3270baba0437e57af98ca2e26f0fdf53d4234a95 100644 (file)
@@ -207,6 +207,14 @@ typedef int (*qemuMonitorDomainAcpiOstInfoCallback)(qemuMonitorPtr mon,
                                                     void *opaque);
 
 
+typedef int (*qemuMonitorDomainBlockThresholdCallback)(qemuMonitorPtr mon,
+                                                       virDomainObjPtr vm,
+                                                       const char *nodename,
+                                                       unsigned long long threshold,
+                                                       unsigned long long excess,
+                                                       void *opaque);
+
+
 typedef struct _qemuMonitorCallbacks qemuMonitorCallbacks;
 typedef qemuMonitorCallbacks *qemuMonitorCallbacksPtr;
 struct _qemuMonitorCallbacks {
@@ -238,6 +246,7 @@ struct _qemuMonitorCallbacks {
     qemuMonitorDomainMigrationStatusCallback domainMigrationStatus;
     qemuMonitorDomainMigrationPassCallback domainMigrationPass;
     qemuMonitorDomainAcpiOstInfoCallback domainAcpiOstInfo;
+    qemuMonitorDomainBlockThresholdCallback domainBlockThreshold;
 };
 
 char *qemuMonitorEscapeArg(const char *in);
@@ -358,6 +367,11 @@ int qemuMonitorEmitAcpiOstInfo(qemuMonitorPtr mon,
                                unsigned int source,
                                unsigned int status);
 
+int qemuMonitorEmitBlockThreshold(qemuMonitorPtr mon,
+                                  const char *nodename,
+                                  unsigned long long threshold,
+                                  unsigned long long excess);
+
 int qemuMonitorStartCPUs(qemuMonitorPtr mon,
                          virConnectPtr conn);
 int qemuMonitorStopCPUs(qemuMonitorPtr mon);
index e45d5fbfc7de41eb5cac02a4bf1d355ee38da4d7..f95afd1ed61655493ba896635072880e5ed61c94 100644 (file)
@@ -89,6 +89,7 @@ static void qemuMonitorJSONHandleSpiceMigrated(qemuMonitorPtr mon, virJSONValueP
 static void qemuMonitorJSONHandleMigrationStatus(qemuMonitorPtr mon, virJSONValuePtr data);
 static void qemuMonitorJSONHandleMigrationPass(qemuMonitorPtr mon, virJSONValuePtr data);
 static void qemuMonitorJSONHandleAcpiOstInfo(qemuMonitorPtr mon, virJSONValuePtr data);
+static void qemuMonitorJSONHandleBlockThreshold(qemuMonitorPtr mon, virJSONValuePtr data);
 
 typedef struct {
     const char *type;
@@ -102,6 +103,7 @@ static qemuEventHandler eventHandlers[] = {
     { "BLOCK_JOB_CANCELLED", qemuMonitorJSONHandleBlockJobCanceled, },
     { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJobCompleted, },
     { "BLOCK_JOB_READY", qemuMonitorJSONHandleBlockJobReady, },
+    { "BLOCK_WRITE_THRESHOLD", qemuMonitorJSONHandleBlockThreshold, },
     { "DEVICE_DELETED", qemuMonitorJSONHandleDeviceDeleted, },
     { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayChange, },
     { "GUEST_PANICKED", qemuMonitorJSONHandleGuestPanic, },
@@ -1065,6 +1067,30 @@ qemuMonitorJSONHandleAcpiOstInfo(qemuMonitorPtr mon, virJSONValuePtr data)
 }
 
 
+static void
+qemuMonitorJSONHandleBlockThreshold(qemuMonitorPtr mon, virJSONValuePtr data)
+{
+    const char *nodename;
+    unsigned long long threshold;
+    unsigned long long excess;
+
+    if (!(nodename = virJSONValueObjectGetString(data, "node-name")))
+        goto error;
+
+    if (virJSONValueObjectGetNumberUlong(data, "write-threshold", &threshold) < 0)
+        goto error;
+
+    if (virJSONValueObjectGetNumberUlong(data, "amount-exceeded", &excess) < 0)
+        goto error;
+
+    qemuMonitorEmitBlockThreshold(mon, nodename, threshold, excess);
+    return;
+
+ error:
+    VIR_WARN("malformed 'BLOCK_WRITE_THRESHOLD' event");
+}
+
+
 int
 qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
                                   const char *cmd_str,
index a348bc3d17c9af4cee76a3b6918e548d36479ebe..59353f7b54754fb90fb9ed670370c3a1828a9ac3 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2004000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index f198715a0c163a97ad61d204225de04e938a070b..8c5c22c49969b1dc5c500d323b820a6ce64c652f 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2005000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index f45560b1c65a570b34d1e8edd65e11fab0ccd8db..ef962992d3fd452aaed4dd06b90ed81a4bcb0283 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2006000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index 721c97be0bcd7cb656f404fe960652fcce8dc625..48f1d6c5fe71ffa099ba8bd0b95a8ea78db0539a 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2006000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index f1c5105be99c40c070cd6545ae0ad219b8b3357b..94a0f6da7dd869e2130c98602d7312fc9dcf8e02 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2006000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index 74b8e9aef8cd7a02a1bc521a511bc59d6650b28c..43ac515eb0243b1c972dd3330f90dc7a167f7ddd 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2006000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index 4c45b3805be4197116b77220139b67c5556327d6..83281a7d28ca580d1683c9e4938ee8069b9f2a21 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2007000</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index d6b589cd2f2a4f272c1ed6c19104c5d0f0a759bb..be5431a398f51bfea168aa1efaaf6317101479c4 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2007000</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.7.0)</package>
index 215159cd170118da86f73906ec50dd48284fa470..776c6f8ee7c5386fce9fea1790f3dc26246ef72f 100644 (file)
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-model-expansion'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2007093</version>
   <kvmVersion>0</kvmVersion>
   <package></package>
index a4a97a7e04e5132f6c44af5fd613fb376424fc6c..c376653e2014f6d0536c49ddeeda71868ea2cc76 100644 (file)
   <flag name='vhost-scsi'/>
   <flag name='drive-iotune-group'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2008000</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.8.0)</package>
index f1adb4ddc9152d2e7025c159330f8f4febdb1c13..e703405e5514b68ae2334a8a7f675d6b9eb2454e 100644 (file)
   <flag name='spice-rendernode'/>
   <flag name='pcie-root-port'/>
   <flag name='query-cpu-definitions'/>
+  <flag name='block-write-threshold'/>
   <version>2008090</version>
   <kvmVersion>0</kvmVersion>
   <package> (v2.9.0-rc0-142-g940a8ce)</package>