6ae9ed
From 06dad6304cfc9e14c505f4ea24e8e995776091e2 Mon Sep 17 00:00:00 2001
6ae9ed
Message-Id: <06dad6304cfc9e14c505f4ea24e8e995776091e2@dist-git>
6ae9ed
From: Peter Krempa <pkrempa@redhat.com>
6ae9ed
Date: Wed, 24 Aug 2016 16:11:22 -0400
6ae9ed
Subject: [PATCH] qemu: monitor: Extract QOM path from query-cpus reply
6ae9ed
6ae9ed
https://bugzilla.redhat.com/show_bug.cgi?id=1097930
6ae9ed
https://bugzilla.redhat.com/show_bug.cgi?id=1224341
6ae9ed
6ae9ed
To allow matching up the data returned by query-cpus to entries in the
6ae9ed
query-hotpluggable-cpus reply for CPU hotplug it's necessary to extract
6ae9ed
the QOM path as it's the only link between the two.
6ae9ed
6ae9ed
(cherry picked from commit c91be16b9ff0bfb8f6db400db4ae36c8a47842fc)
6ae9ed
---
6ae9ed
 src/qemu/qemu_monitor.c      |  7 ++++++-
6ae9ed
 src/qemu/qemu_monitor.h      |  1 +
6ae9ed
 src/qemu/qemu_monitor_json.c | 16 ++++++++++++++--
6ae9ed
 tests/qemumonitorjsontest.c  | 14 +++++++++-----
6ae9ed
 4 files changed, 30 insertions(+), 8 deletions(-)
6ae9ed
6ae9ed
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
6ae9ed
index d5af7d1..573c94a 100644
6ae9ed
--- a/src/qemu/qemu_monitor.c
6ae9ed
+++ b/src/qemu/qemu_monitor.c
6ae9ed
@@ -1663,11 +1663,16 @@ qemuMonitorCPUInfoFree(qemuMonitorCPUInfoPtr cpus,
6ae9ed
 
6ae9ed
 void
6ae9ed
 qemuMonitorQueryCpusFree(struct qemuMonitorQueryCpusEntry *entries,
6ae9ed
-                         size_t nentries ATTRIBUTE_UNUSED)
6ae9ed
+                         size_t nentries)
6ae9ed
 {
6ae9ed
+    size_t i;
6ae9ed
+
6ae9ed
     if (!entries)
6ae9ed
         return;
6ae9ed
 
6ae9ed
+    for (i = 0; i < nentries; i++)
6ae9ed
+        VIR_FREE(entries[i].qom_path);
6ae9ed
+
6ae9ed
     VIR_FREE(entries);
6ae9ed
 }
6ae9ed
 
6ae9ed
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
6ae9ed
index 2269d60..83396a4 100644
6ae9ed
--- a/src/qemu/qemu_monitor.h
6ae9ed
+++ b/src/qemu/qemu_monitor.h
6ae9ed
@@ -392,6 +392,7 @@ int qemuMonitorSystemPowerdown(qemuMonitorPtr mon);
6ae9ed
 
6ae9ed
 struct qemuMonitorQueryCpusEntry {
6ae9ed
     pid_t tid;
6ae9ed
+    char *qom_path;
6ae9ed
 };
6ae9ed
 void qemuMonitorQueryCpusFree(struct qemuMonitorQueryCpusEntry *entries,
6ae9ed
                               size_t nentries);
6ae9ed
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
6ae9ed
index 8243b52..a59b195 100644
6ae9ed
--- a/src/qemu/qemu_monitor_json.c
6ae9ed
+++ b/src/qemu/qemu_monitor_json.c
6ae9ed
@@ -1325,8 +1325,16 @@ int qemuMonitorJSONSystemReset(qemuMonitorPtr mon)
6ae9ed
 
6ae9ed
 
6ae9ed
 /*
6ae9ed
- * [ { "CPU": 0, "current": true, "halted": false, "pc": 3227107138 },
6ae9ed
- *   { "CPU": 1, "current": false, "halted": true, "pc": 7108165 } ]
6ae9ed
+ *
6ae9ed
+ * [{ "arch": "x86",
6ae9ed
+ *    "current": true,
6ae9ed
+ *    "CPU": 0,
6ae9ed
+ *    "qom_path": "/machine/unattached/device[0]",
6ae9ed
+ *    "pc": -2130415978,
6ae9ed
+ *    "halted": true,
6ae9ed
+ *    "thread_id": 2631237},
6ae9ed
+ *    {...}
6ae9ed
+ *  ]
6ae9ed
  */
6ae9ed
 static int
6ae9ed
 qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
6ae9ed
@@ -1347,6 +1355,7 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
6ae9ed
     for (i = 0; i < ncpus; i++) {
6ae9ed
         virJSONValuePtr entry = virJSONValueArrayGet(data, i);
6ae9ed
         int thread = 0;
6ae9ed
+        const char *qom_path;
6ae9ed
         if (!entry) {
6ae9ed
             ret = -2;
6ae9ed
             goto cleanup;
6ae9ed
@@ -1355,8 +1364,11 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
6ae9ed
         /* Some older qemu versions don't report the thread_id so treat this as
6ae9ed
          * non-fatal, simply returning no data */
6ae9ed
         ignore_value(virJSONValueObjectGetNumberInt(entry, "thread_id", &thread));
6ae9ed
+        qom_path = virJSONValueObjectGetString(entry, "qom_path");
6ae9ed
 
6ae9ed
         cpus[i].tid = thread;
6ae9ed
+        if (VIR_STRDUP(cpus[i].qom_path, qom_path) < 0)
6ae9ed
+            goto cleanup;
6ae9ed
     }
6ae9ed
 
6ae9ed
     VIR_STEAL_PTR(*entries, cpus);
6ae9ed
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
6ae9ed
index 3fd4eb6..8c31005 100644
6ae9ed
--- a/tests/qemumonitorjsontest.c
6ae9ed
+++ b/tests/qemumonitorjsontest.c
6ae9ed
@@ -1205,7 +1205,8 @@ static bool
6ae9ed
 testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a,
6ae9ed
                                                  struct qemuMonitorQueryCpusEntry *b)
6ae9ed
 {
6ae9ed
-    if (a->tid != b->tid)
6ae9ed
+    if (a->tid != b->tid ||
6ae9ed
+        STRNEQ_NULLABLE(a->qom_path, b->qom_path))
6ae9ed
         return false;
6ae9ed
 
6ae9ed
     return true;
6ae9ed
@@ -1220,10 +1221,10 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
6ae9ed
     int ret = -1;
6ae9ed
     struct qemuMonitorQueryCpusEntry *cpudata = NULL;
6ae9ed
     struct qemuMonitorQueryCpusEntry expect[] = {
6ae9ed
-        {17622},
6ae9ed
-        {17624},
6ae9ed
-        {17626},
6ae9ed
-        {17628},
6ae9ed
+        {17622, (char *) "/machine/unattached/device[0]"},
6ae9ed
+        {17624, (char *) "/machine/unattached/device[1]"},
6ae9ed
+        {17626, (char *) "/machine/unattached/device[2]"},
6ae9ed
+        {17628, NULL},
6ae9ed
     };
6ae9ed
     size_t ncpudata = 0;
6ae9ed
     size_t i;
6ae9ed
@@ -1237,6 +1238,7 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
6ae9ed
                                "        {"
6ae9ed
                                "            \"current\": true,"
6ae9ed
                                "            \"CPU\": 0,"
6ae9ed
+                               "            \"qom_path\": \"/machine/unattached/device[0]\","
6ae9ed
                                "            \"pc\": -2130530478,"
6ae9ed
                                "            \"halted\": true,"
6ae9ed
                                "            \"thread_id\": 17622"
6ae9ed
@@ -1244,6 +1246,7 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
6ae9ed
                                "        {"
6ae9ed
                                "            \"current\": false,"
6ae9ed
                                "            \"CPU\": 1,"
6ae9ed
+                               "            \"qom_path\": \"/machine/unattached/device[1]\","
6ae9ed
                                "            \"pc\": -2130530478,"
6ae9ed
                                "            \"halted\": true,"
6ae9ed
                                "            \"thread_id\": 17624"
6ae9ed
@@ -1251,6 +1254,7 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
6ae9ed
                                "        {"
6ae9ed
                                "            \"current\": false,"
6ae9ed
                                "            \"CPU\": 2,"
6ae9ed
+                               "            \"qom_path\": \"/machine/unattached/device[2]\","
6ae9ed
                                "            \"pc\": -2130530478,"
6ae9ed
                                "            \"halted\": true,"
6ae9ed
                                "            \"thread_id\": 17626"
6ae9ed
-- 
6ae9ed
2.10.0
6ae9ed