Storing of the ID will allow simpler extraction of data present only in
query-cpus without the need to call qemuMonitorGetCPUInfo in statistics
paths.
---
src/qemu/qemu_domain.c | 1 +
src/qemu/qemu_domain.h | 1 +
src/qemu/qemu_monitor.h | 2 ++
src/qemu/qemu_monitor_json.c | 3 +++
src/qemu/qemu_monitor_text.c | 11 +++++++++++
tests/qemumonitorjsontest.c | 8 ++++----
6 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 0f113a7..fbb291c 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6318,6 +6318,7 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
VIR_FREE(vcpupriv->alias);
VIR_STEAL_PTR(vcpupriv->alias, info[i].alias);
vcpupriv->enable_id = info[i].id;
+ vcpupriv->qemu_id = info[i].qemu_id;
if (hotplug && state) {
vcpu->online = info[i].online;
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index f538d22..9df5266 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -322,6 +322,7 @@ struct _qemuDomainVcpuPrivate {
pid_t tid; /* vcpu thread id */
int enable_id; /* order in which the vcpus were enabled in qemu */
+ int qemu_id; /* ID reported by qemu as 'CPU' in query-cpus */
char *alias;
bool halted;
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index a0e5075..49d43bc 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -392,6 +392,7 @@ int qemuMonitorSystemReset(qemuMonitorPtr mon);
int qemuMonitorSystemPowerdown(qemuMonitorPtr mon);
struct qemuMonitorQueryCpusEntry {
+ int qemu_id; /* id of the cpu as reported by qemu */
pid_t tid;
char *qom_path;
bool halted;
@@ -422,6 +423,7 @@ void qemuMonitorQueryHotpluggableCpusFree(struct
qemuMonitorQueryHotpluggableCpu
struct _qemuMonitorCPUInfo {
pid_t tid;
int id; /* order of enabling of the given cpu */
+ int qemu_id; /* identifier of the cpu as reported by query-cpus */
/* state data */
bool online;
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 9e06a4d..57b65ac 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1348,6 +1348,7 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
for (i = 0; i < ncpus; i++) {
virJSONValuePtr entry = virJSONValueArrayGet(data, i);
+ int cpuid = -1;
int thread = 0;
bool halted = false;
const char *qom_path;
@@ -1358,10 +1359,12 @@ 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, "CPU",
&cpuid));
ignore_value(virJSONValueObjectGetNumberInt(entry, "thread_id",
&thread));
ignore_value(virJSONValueObjectGetBoolean(entry, "halted",
&halted));
qom_path = virJSONValueObjectGetString(entry, "qom_path");
+ cpus[i].qemu_id = cpuid;
cpus[i].tid = thread;
cpus[i].halted = halted;
if (VIR_STRDUP(cpus[i].qom_path, qom_path) < 0)
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index f975347..4692d53 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -528,8 +528,18 @@ qemuMonitorTextQueryCPUs(qemuMonitorPtr mon,
do {
char *offset = NULL;
char *end = NULL;
+ int cpuid = -1;
int tid = 0;
+ /* extract cpu number */
+ if ((offset = strstr(line, "#")) == NULL)
+ goto cleanup;
+
+ if (virStrToLong_i(offset + strlen("#"), &end, 10, &cpuid) <
0)
+ goto cleanup;
+ if (end == NULL || *end != ':')
+ goto cleanup;
+
/* Extract host Thread ID */
if ((offset = strstr(line, "thread_id=")) == NULL)
goto cleanup;
@@ -539,6 +549,7 @@ qemuMonitorTextQueryCPUs(qemuMonitorPtr mon,
if (end == NULL || !c_isspace(*end))
goto cleanup;
+ cpu.qemu_id = cpuid;
cpu.tid = tid;
/* Extract halted indicator */
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index 9f889a9..ed4190b 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -1338,10 +1338,10 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
int ret = -1;
struct qemuMonitorQueryCpusEntry *cpudata = NULL;
struct qemuMonitorQueryCpusEntry expect[] = {
- {17622, (char *) "/machine/unattached/device[0]", true},
- {17624, (char *) "/machine/unattached/device[1]", true},
- {17626, (char *) "/machine/unattached/device[2]", true},
- {17628, NULL, true},
+ {0, 17622, (char *) "/machine/unattached/device[0]", true},
+ {1, 17624, (char *) "/machine/unattached/device[1]", true},
+ {2, 17626, (char *) "/machine/unattached/device[2]", true},
+ {3, 17628, NULL, true},
};
size_t ncpudata = 0;
size_t i;
--
2.10.2