]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: fix detection of vCPU pids when multiple dies are present
authorDaniel P. Berrangé <berrange@redhat.com>
Fri, 13 Mar 2020 16:43:26 +0000 (16:43 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Mon, 16 Mar 2020 16:00:27 +0000 (16:00 +0000)
The logic for querying hotpluggable CPUs needs to sort the list
of CPUs returned by QEMU. Unfortunately our sorting method failed
to use the die_id field, so CPUs were not correctly sorted.

This is seen when configuring a guest with partially populated
CPUs

  <vcpu placement='static' current='1'>16</vcpu>
  <cpu...>
    <topology sockets='4' dies='2' cores='1' threads='2'/>
  </cpu>

Then trying to start it would fail:

  # virsh -c qemu:///system start demo
  error: Failed to start domain demo
  error: internal error: qemu didn't report thread id for vcpu '0'

Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c

index 34eb0945289076fbffd103b14c3e297b5e05c2a9..68b1da295848e0bd0542c8be8fa642cf40fd548a 100644 (file)
@@ -13644,8 +13644,14 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
         }
 
         if (validTIDs)
-            VIR_DEBUG("vCPU[%zu] PID %llu is valid",
-                      i, (unsigned long long)info[i].tid);
+            VIR_DEBUG("vCPU[%zu] PID %llu is valid "
+                      "(node=%d socket=%d die=%d core=%d thread=%d)",
+                      i, (unsigned long long)info[i].tid,
+                      info[i].node_id,
+                      info[i].socket_id,
+                      info[i].die_id,
+                      info[i].core_id,
+                      info[i].thread_id);
     }
 
     VIR_DEBUG("Extracting vCPU information validTIDs=%d", validTIDs);
index e3d621f038f1d92fa4ef5752dd3b9b7cd2ab0f05..017b818f73736a6e6ed43584797e1da77a6df726 100644 (file)
@@ -1615,6 +1615,7 @@ qemuMonitorCPUInfoClear(qemuMonitorCPUInfoPtr cpus,
         cpus[i].id = 0;
         cpus[i].qemu_id = -1;
         cpus[i].socket_id = -1;
+        cpus[i].die_id = -1;
         cpus[i].core_id = -1;
         cpus[i].thread_id = -1;
         cpus[i].node_id = -1;
@@ -1770,6 +1771,7 @@ qemuMonitorGetCPUInfoHotplug(struct qemuMonitorQueryHotpluggableCpusEntry *hotpl
         vcpus[mastervcpu].hotpluggable = !!hotplugvcpus[i].alias ||
                                          !vcpus[mastervcpu].online;
         vcpus[mastervcpu].socket_id = hotplugvcpus[i].socket_id;
+        vcpus[mastervcpu].die_id = hotplugvcpus[i].die_id;
         vcpus[mastervcpu].core_id = hotplugvcpus[i].core_id;
         vcpus[mastervcpu].thread_id = hotplugvcpus[i].thread_id;
         vcpus[mastervcpu].node_id = hotplugvcpus[i].node_id;
index 6ccea909e99e5c3dd6c68827ca0baefb71d4bfb4..be4195e734a221f55b842ae547dc1f8184283b34 100644 (file)
@@ -561,6 +561,7 @@ struct qemuMonitorQueryHotpluggableCpusEntry {
     /* topology information -1 if qemu didn't report given parameter */
     int node_id;
     int socket_id;
+    int die_id;
     int core_id;
     int thread_id;
 
@@ -583,6 +584,7 @@ struct _qemuMonitorCPUInfo {
     /* topology info for hotplug purposes. Hotplug of given vcpu impossible if
      * all entries are -1 */
     int socket_id;
+    int die_id;
     int core_id;
     int thread_id;
     int node_id;
index 3eac80c060884116568b51969f9cb8f51292241d..8e1e81ee069f69fa030f57bcb8acceb859932b04 100644 (file)
@@ -8560,11 +8560,13 @@ qemuMonitorJSONProcessHotpluggableCpusReply(virJSONValuePtr vcpu,
 
     entry->node_id = -1;
     entry->socket_id = -1;
+    entry->die_id = -1;
     entry->core_id = -1;
     entry->thread_id = -1;
 
     ignore_value(virJSONValueObjectGetNumberInt(props, "node-id", &entry->node_id));
     ignore_value(virJSONValueObjectGetNumberInt(props, "socket-id", &entry->socket_id));
+    ignore_value(virJSONValueObjectGetNumberInt(props, "die-id", &entry->die_id));
     ignore_value(virJSONValueObjectGetNumberInt(props, "core-id", &entry->core_id));
     ignore_value(virJSONValueObjectGetNumberInt(props, "thread-id", &entry->thread_id));
 
@@ -8599,6 +8601,9 @@ qemuMonitorQueryHotpluggableCpusEntrySort(const void *p1,
     if (a->socket_id != b->socket_id)
         return a->socket_id - b->socket_id;
 
+    if (a->die_id != b->die_id)
+        return a->die_id - b->die_id;
+
     if (a->core_id != b->core_id)
         return a->core_id - b->core_id;