From 4d5c1bc24119e90dfbcdae6a120027e5c1ede608 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Fri, 24 Oct 2025 17:16:32 +0200 Subject: [PATCH] qemu_monitor: Filter CPU features reported by QEMU MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Some features may be on our ignore list because they do nothing even though QEMU still supports them and reports their state. But as the features do nothing, the state reported by QEMU may not correspond to what the guest sees. To avoid possible confusion we may just pretend QEMU did not report any of the features on our ignore list. Signed-off-by: Jiri Denemark Reviewed-by: Ján Tomko --- src/qemu/qemu_monitor.c | 6 ++++-- src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 16 ++++++++++++---- src/qemu/qemu_monitor_json.h | 1 + src/qemu/qemu_process.c | 1 + tests/qemumonitorjsontest.c | 1 + 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index f9b320f765..3dbaaf9c59 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3686,7 +3686,8 @@ qemuMonitorSetDomainLog(qemuMonitor *mon, * a single qom-list-get QMP command * @cpuQOMPath: QOM path of a CPU to probe * @translate: callback for translating CPU feature names from QEMU to libvirt - * @opaque: data for @translate callback + * @filter: callback for filtering ignored features, a pointer to @arch is + * passed as opaque pointer to the callback * @enabled: returns the CPU data for all enabled features * @disabled: returns the CPU data for features which we asked for * (either explicitly or via a named CPU model) but QEMU disabled them @@ -3701,6 +3702,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback translate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled) { @@ -3715,7 +3717,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, *disabled = NULL; return qemuMonitorJSONGetGuestCPU(mon, arch, qomListGet, cpuQOMPath, - translate, enabled, disabled); + translate, filter, enabled, disabled); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index f611ebfa24..d950d548b4 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1495,6 +1495,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback translate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index c121c05ffd..9b9a005771 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -6795,7 +6795,8 @@ qemuMonitorJSONGetCPUProperties(qemuMonitor *mon, static int qemuMonitorJSONCPUDataAddFeatures(virCPUData *data, GStrv props, - qemuMonitorCPUFeatureTranslationCallback translate) + qemuMonitorCPUFeatureTranslationCallback translate, + virCPUDefFeatureFilter filter) { char **p; @@ -6805,6 +6806,9 @@ qemuMonitorJSONCPUDataAddFeatures(virCPUData *data, if (translate) name = translate(data->arch, name); + if (filter && !filter(name, VIR_CPU_FEATURE_REQUIRE, &data->arch)) + continue; + if (virCPUDataAddFeature(data, name) < 0) return -1; } @@ -6821,7 +6825,8 @@ qemuMonitorJSONCPUDataAddFeatures(virCPUData *data, * a single qom-list-get QMP command * @cpuQOMPath: QOM path of a CPU to probe * @translate: callback for translating CPU feature names from QEMU to libvirt - * @opaque: data for @translate callback + * @filter: callback for filtering ignored features, a pointer to @arch is + * passed as opaque pointer to the callback * @enabled: returns the CPU data for all enabled features * @disabled: returns the CPU data for features which we asked for * (either explicitly or via a named CPU model) but QEMU disabled them @@ -6836,6 +6841,7 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback translate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled) { @@ -6852,8 +6858,10 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, &propsEnabled, &propsDisabled) < 0) return -1; - if (qemuMonitorJSONCPUDataAddFeatures(cpuEnabled, propsEnabled, translate) < 0 || - qemuMonitorJSONCPUDataAddFeatures(cpuDisabled, propsDisabled, translate) < 0) + if (qemuMonitorJSONCPUDataAddFeatures(cpuEnabled, propsEnabled, + translate, filter) < 0 || + qemuMonitorJSONCPUDataAddFeatures(cpuDisabled, propsDisabled, + translate, filter) < 0) return -1; *enabled = g_steal_pointer(&cpuEnabled); diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 8b06b7599e..f20830532d 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -558,6 +558,7 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon, bool qomListGet, const char *cpuQOMPath, qemuMonitorCPUFeatureTranslationCallback translate, + virCPUDefFeatureFilter filter, virCPUData **enabled, virCPUData **disabled); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d93ea4058d..45fc32a663 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4595,6 +4595,7 @@ qemuProcessFetchGuestCPU(virDomainObj *vm, virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QOM_LIST_GET), cpuQOMPath, virQEMUCapsCPUFeatureFromQEMU, + virQEMUCapsCPUFilterFeatures, &dataEnabled, &dataDisabled); qemuDomainObjExitMonitor(vm); diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 6129dde449..bfe81739a7 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2809,6 +2809,7 @@ testQemuMonitorJSONGetGuestCPU(const void *opaque) data->qomListGet, "/machine/unattached/device[0]", virQEMUCapsCPUFeatureFromQEMU, + virQEMUCapsCPUFilterFeatures, &dataEnabled, &dataDisabled) < 0) return -1; -- 2.47.3