From 3f71c797689a4a70878bc50b341763dfc34a98ff Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 21 Nov 2016 14:57:54 +0100 Subject: [PATCH] qemu: monitor: Extract qemu cpu id along with other data 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 0f113a75e6..fbb291c574 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 f538d2259d..9df5266be0 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 a0e5075229..49d43bce78 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 ef8672cad3..90d74d5466 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -1344,6 +1344,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; @@ -1354,10 +1355,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 f9753476b0..4692d53a4c 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 9f889a930c..ed4190b3b2 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;