- docs: Document CPU clusters - docs: Improve documentation for CPU topology - tests: Verify handling of CPU clusters in QMP data - qemu: Make monitor aware of CPU clusters - qemu: Use CPU clusters for guests - qemu: Introduce QEMU_CAPS_SMP_CLUSTERS - conf: Allow specifying CPU clusters - conf: Report CPU clusters in capabilities XML - tests: Add hostcpudata for machine with CPU clusters - cpu_map: add kunpeng-920 features to arm features - cpu/aarch64: enable host-model cpu for AArch64 architecture - conf/domain_conf: pin the retry_interval and retry_timeout parameters to xml - nodedev: fix potential heap use after free - libvirt/conf: Set default values of retry fileds - qemu: Support 'retry' BLOCK_IO_ERROR event. - libvirt: Add 'retry' support for error policy - vdpa: support vdpa device migrate - vdpa: support vdpa device hot plug/unplug - hostdev:Introduce vDPA device to hostdev subsystem as a new subtype - node_device: fix leak of DIR* - migration/multifd-pin: support migration multifd thread pin - migration/multifd-pin: add qemu monitor callback functions - migration/migration-pin: add domainMigrationPid for qemuMonitorCallbacks - migration/migration-pin: add migrationpin for migration parameters - migration/migration-pin: add qemu monitor callback functions - migration/migration-pin:add some migration/multiFd params - qemu: add pointer check in qemuMonitorLastError - qemu: fix a concurrent operation situation - test/commandtest: skip the test4 if the testcase is run in the container env Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com>
113 lines
4.3 KiB
Diff
113 lines
4.3 KiB
Diff
From 7ae220e6640315b2b10f79a98eee81c1c6f3ea1d Mon Sep 17 00:00:00 2001
|
|
From: Andrea Bolognani <abologna@redhat.com>
|
|
Date: Fri, 5 Jan 2024 18:51:29 +0100
|
|
Subject: [PATCH] qemu: Make monitor aware of CPU clusters
|
|
|
|
This makes it so libvirt can obtain accurate information about
|
|
guest CPUs from QEMU, and should make it possible to correctly
|
|
perform operations such as CPU hotplug.
|
|
|
|
Of course this is mostly moot at the moment: only aarch64 can use
|
|
CPU clusters, and CPU hotplug is not yet implemented on that
|
|
architecture.
|
|
|
|
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
|
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
|
---
|
|
src/qemu/qemu_domain.c | 3 ++-
|
|
src/qemu/qemu_monitor.c | 2 ++
|
|
src/qemu/qemu_monitor.h | 2 ++
|
|
src/qemu/qemu_monitor_json.c | 5 +++++
|
|
4 files changed, 11 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
|
index 39fd3270fc..d54846e734 100644
|
|
--- a/src/qemu/qemu_domain.c
|
|
+++ b/src/qemu/qemu_domain.c
|
|
@@ -9909,11 +9909,12 @@ qemuDomainRefreshVcpuInfo(virDomainObj *vm,
|
|
|
|
if (validTIDs)
|
|
VIR_DEBUG("vCPU[%zu] PID %llu is valid "
|
|
- "(node=%d socket=%d die=%d core=%d thread=%d)",
|
|
+ "(node=%d socket=%d die=%d cluster=%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].cluster_id,
|
|
info[i].core_id,
|
|
info[i].thread_id);
|
|
}
|
|
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
|
|
index e4a1852d05..e270bee2cd 100644
|
|
--- a/src/qemu/qemu_monitor.c
|
|
+++ b/src/qemu/qemu_monitor.c
|
|
@@ -1519,6 +1519,7 @@ qemuMonitorCPUInfoClear(qemuMonitorCPUInfo *cpus,
|
|
cpus[i].qemu_id = -1;
|
|
cpus[i].socket_id = -1;
|
|
cpus[i].die_id = -1;
|
|
+ cpus[i].cluster_id = -1;
|
|
cpus[i].core_id = -1;
|
|
cpus[i].thread_id = -1;
|
|
cpus[i].node_id = -1;
|
|
@@ -1676,6 +1677,7 @@ qemuMonitorGetCPUInfoHotplug(struct qemuMonitorQueryHotpluggableCpusEntry *hotpl
|
|
!vcpus[mainvcpu].online;
|
|
vcpus[mainvcpu].socket_id = hotplugvcpus[i].socket_id;
|
|
vcpus[mainvcpu].die_id = hotplugvcpus[i].die_id;
|
|
+ vcpus[mainvcpu].cluster_id = hotplugvcpus[i].cluster_id;
|
|
vcpus[mainvcpu].core_id = hotplugvcpus[i].core_id;
|
|
vcpus[mainvcpu].thread_id = hotplugvcpus[i].thread_id;
|
|
vcpus[mainvcpu].node_id = hotplugvcpus[i].node_id;
|
|
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
|
|
index e893542971..4cbd225e8f 100644
|
|
--- a/src/qemu/qemu_monitor.h
|
|
+++ b/src/qemu/qemu_monitor.h
|
|
@@ -605,6 +605,7 @@ struct qemuMonitorQueryHotpluggableCpusEntry {
|
|
int node_id;
|
|
int socket_id;
|
|
int die_id;
|
|
+ int cluster_id;
|
|
int core_id;
|
|
int thread_id;
|
|
|
|
@@ -628,6 +629,7 @@ struct _qemuMonitorCPUInfo {
|
|
* all entries are -1 */
|
|
int socket_id;
|
|
int die_id;
|
|
+ int cluster_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 8bf56e99f5..3748034bb9 100644
|
|
--- a/src/qemu/qemu_monitor_json.c
|
|
+++ b/src/qemu/qemu_monitor_json.c
|
|
@@ -7606,12 +7606,14 @@ qemuMonitorJSONProcessHotpluggableCpusReply(virJSONValue *vcpu,
|
|
entry->node_id = -1;
|
|
entry->socket_id = -1;
|
|
entry->die_id = -1;
|
|
+ entry->cluster_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, "cluster-id", &entry->cluster_id));
|
|
ignore_value(virJSONValueObjectGetNumberInt(props, "core-id", &entry->core_id));
|
|
ignore_value(virJSONValueObjectGetNumberInt(props, "thread-id", &entry->thread_id));
|
|
|
|
@@ -7649,6 +7651,9 @@ qemuMonitorQueryHotpluggableCpusEntrySort(const void *p1,
|
|
if (a->die_id != b->die_id)
|
|
return a->die_id - b->die_id;
|
|
|
|
+ if (a->cluster_id != b->cluster_id)
|
|
+ return a->cluster_id - b->cluster_id;
|
|
+
|
|
if (a->core_id != b->core_id)
|
|
return a->core_id - b->core_id;
|
|
|
|
--
|
|
2.27.0
|
|
|