[libvirt] [PATCH v3 06/24] qemu: monitor: Extract QOM path from query-cpus reply

Peter Krempa pkrempa at redhat.com
Wed Aug 24 13:35:22 UTC 2016


To allow matching up the data returned by query-cpus to entries in the
query-hotpluggable-cpus reply for CPU hotplug it's necessary to extract
the QOM path as it's the only link between the two.
---

Notes:
    v2:
    - fixed commit message
    - already ACKed

 src/qemu/qemu_monitor.c      |  7 ++++++-
 src/qemu/qemu_monitor.h      |  1 +
 src/qemu/qemu_monitor_json.c | 16 ++++++++++++++--
 tests/qemumonitorjsontest.c  | 14 +++++++++-----
 4 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 65c32bd..8fbe444 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -1668,11 +1668,16 @@ qemuMonitorCPUInfoFree(qemuMonitorCPUInfoPtr cpus,

 void
 qemuMonitorQueryCpusFree(struct qemuMonitorQueryCpusEntry *entries,
-                         size_t nentries ATTRIBUTE_UNUSED)
+                         size_t nentries)
 {
+    size_t i;
+
     if (!entries)
         return;

+    for (i = 0; i < nentries; i++)
+        VIR_FREE(entries[i].qom_path);
+
     VIR_FREE(entries);
 }

diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 417091c..576b2af 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -392,6 +392,7 @@ int qemuMonitorSystemPowerdown(qemuMonitorPtr mon);

 struct qemuMonitorQueryCpusEntry {
     pid_t tid;
+    char *qom_path;
 };
 void qemuMonitorQueryCpusFree(struct qemuMonitorQueryCpusEntry *entries,
                               size_t nentries);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index ab5423e..9e0ea87 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1319,8 +1319,16 @@ int qemuMonitorJSONSystemReset(qemuMonitorPtr mon)


 /*
- * [ { "CPU": 0, "current": true, "halted": false, "pc": 3227107138 },
- *   { "CPU": 1, "current": false, "halted": true, "pc": 7108165 } ]
+ *
+ * [{ "arch": "x86",
+ *    "current": true,
+ *    "CPU": 0,
+ *    "qom_path": "/machine/unattached/device[0]",
+ *    "pc": -2130415978,
+ *    "halted": true,
+ *    "thread_id": 2631237},
+ *    {...}
+ *  ]
  */
 static int
 qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
@@ -1341,6 +1349,7 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
     for (i = 0; i < ncpus; i++) {
         virJSONValuePtr entry = virJSONValueArrayGet(data, i);
         int thread = 0;
+        const char *qom_path;
         if (!entry) {
             ret = -2;
             goto cleanup;
@@ -1349,8 +1358,11 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
         /* Some older qemu versions don't report the thread_id so treat this as
          * non-fatal, simply returning no data */
         ignore_value(virJSONValueObjectGetNumberInt(entry, "thread_id", &thread));
+        qom_path = virJSONValueObjectGetString(entry, "qom_path");

         cpus[i].tid = thread;
+        if (VIR_STRDUP(cpus[i].qom_path, qom_path) < 0)
+            goto cleanup;
     }

     VIR_STEAL_PTR(*entries, cpus);
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index 242544d..50ba0cf 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -1205,7 +1205,8 @@ static bool
 testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a,
                                                  struct qemuMonitorQueryCpusEntry *b)
 {
-    if (a->tid != b->tid)
+    if (a->tid != b->tid ||
+        STRNEQ_NULLABLE(a->qom_path, b->qom_path))
         return false;

     return true;
@@ -1220,10 +1221,10 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
     int ret = -1;
     struct qemuMonitorQueryCpusEntry *cpudata = NULL;
     struct qemuMonitorQueryCpusEntry expect[] = {
-        {17622},
-        {17624},
-        {17626},
-        {17628},
+        {17622, (char *) "/machine/unattached/device[0]"},
+        {17624, (char *) "/machine/unattached/device[1]"},
+        {17626, (char *) "/machine/unattached/device[2]"},
+        {17628, NULL},
     };
     size_t ncpudata = 0;
     size_t i;
@@ -1237,6 +1238,7 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
                                "        {"
                                "            \"current\": true,"
                                "            \"CPU\": 0,"
+                               "            \"qom_path\": \"/machine/unattached/device[0]\","
                                "            \"pc\": -2130530478,"
                                "            \"halted\": true,"
                                "            \"thread_id\": 17622"
@@ -1244,6 +1246,7 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
                                "        {"
                                "            \"current\": false,"
                                "            \"CPU\": 1,"
+                               "            \"qom_path\": \"/machine/unattached/device[1]\","
                                "            \"pc\": -2130530478,"
                                "            \"halted\": true,"
                                "            \"thread_id\": 17624"
@@ -1251,6 +1254,7 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
                                "        {"
                                "            \"current\": false,"
                                "            \"CPU\": 2,"
+                               "            \"qom_path\": \"/machine/unattached/device[2]\","
                                "            \"pc\": -2130530478,"
                                "            \"halted\": true,"
                                "            \"thread_id\": 17626"
-- 
2.8.2




More information about the libvir-list mailing list