From d97b868a9517173a7f805fd3232b3d9fdc2bad89 Mon Sep 17 00:00:00 2001 Message-Id: From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Tue, 5 May 2020 16:49:12 +0100 Subject: [PATCH] qemu: fix detection of vCPU pids when multiple dies are present MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 16 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 Signed-off-by: Daniel P. Berrangé (cherry picked from commit 8b789c6574454863acbd2511fc2094d1e63e8154) https://bugzilla.redhat.com/show_bug.cgi?id=1813395 https://bugzilla.redhat.com/show_bug.cgi?id=1821592 Message-Id: <20200505154912.950468-2-berrange@redhat.com> Reviewed-by: Jiri Denemark --- src/qemu/qemu_domain.c | 10 ++++++++-- src/qemu/qemu_monitor.c | 2 ++ src/qemu/qemu_monitor.h | 2 ++ src/qemu/qemu_monitor_json.c | 5 +++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1509e41021..cdf7b3e692 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -13812,8 +13812,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); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 5915035589..d8911066ab 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1667,6 +1667,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; @@ -1822,6 +1823,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; diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index ca975d084c..6e83f250ed 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -567,6 +567,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; @@ -589,6 +590,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; diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 92d7317a82..d445a4904f 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8576,11 +8576,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)); @@ -8615,6 +8617,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; -- 2.26.2