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 f25c68d..f87f431 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 ad68e16..4be4618 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;
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