qemu: fix detection of vCPU pids when multiple dies are present

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>
This commit is contained in:
Daniel P. Berrangé 2020-03-13 16:43:26 +00:00
parent e8e44020c8
commit 8b789c6574
4 changed files with 17 additions and 2 deletions

View 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);

View 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;

View 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;

View 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;