]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: monitor: Extract qemu cpu id along with other data
authorPeter Krempa <pkrempa@redhat.com>
Mon, 21 Nov 2016 13:57:54 +0000 (14:57 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 21 Nov 2016 16:19:48 +0000 (17:19 +0100)
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
src/qemu/qemu_domain.h
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_text.c
tests/qemumonitorjsontest.c

index 0f113a75e6b8395986e6de6ef7db4d52d7f5e572..fbb291c57477faaca1df2861a744e0ce43707e52 100644 (file)
@@ -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;
index f538d2259de6dd2b1813d631b055283c6839b8a7..9df5266be08f0e9709a4583da86404591bc6e139 100644 (file)
@@ -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;
 
index a0e5075229df0035374f2461f5f8ab0a3d89c22d..49d43bce785384e6fc380e258cbc9c2c7d1f388e 100644 (file)
@@ -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;
index ef8672cad3c51e2b24f62c76bc887f62af0d07f8..90d74d546651bd01689e4f3cf25f375d1d0a8c36 100644 (file)
@@ -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)
index f9753476b0af14adcf9b7fceafe96f6118feed3c..4692d53a4c44b17966fa768573669aa2cfac4641 100644 (file)
@@ -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 */
index 9f889a930c36f7801f0c4d822a492dd32a159790..ed4190b3b2a8e612c67e4d901152d2c9732b3c42 100644 (file)
@@ -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;