]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_monitor: Filter CPU features reported by QEMU
authorJiri Denemark <jdenemar@redhat.com>
Fri, 24 Oct 2025 15:16:32 +0000 (17:16 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 3 Nov 2025 11:33:26 +0000 (12:33 +0100)
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 <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
src/qemu/qemu_process.c
tests/qemumonitorjsontest.c

index f9b320f76535a65a1dc01228682d738cfaf48e38..3dbaaf9c595ac3553c97da2d34d6baf60a818cb1 100644 (file)
@@ -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);
 }
 
 
index f611ebfa24849c096afd853befa8e4ae6f9fe005..d950d548b45228b3b0f00994607695e8f61e1fde 100644 (file)
@@ -1495,6 +1495,7 @@ qemuMonitorGetGuestCPU(qemuMonitor *mon,
                        bool qomListGet,
                        const char *cpuQOMPath,
                        qemuMonitorCPUFeatureTranslationCallback translate,
+                       virCPUDefFeatureFilter filter,
                        virCPUData **enabled,
                        virCPUData **disabled);
 
index c121c05ffd53d3c0f9c27c6246583f862d36bf7b..9b9a005771834b83d942eb0d6e0dc95e6b671a5c 100644 (file)
@@ -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);
index 8b06b7599ef61c254c9e247cbbb661a02e922bfd..f20830532d2fbfeb1be4d164a05d1008cc91b4c3 100644 (file)
@@ -558,6 +558,7 @@ qemuMonitorJSONGetGuestCPU(qemuMonitor *mon,
                            bool qomListGet,
                            const char *cpuQOMPath,
                            qemuMonitorCPUFeatureTranslationCallback translate,
+                           virCPUDefFeatureFilter filter,
                            virCPUData **enabled,
                            virCPUData **disabled);
 
index d93ea4058d02a640dd0dfe3f0be503fea2b2d4b6..45fc32a663c801d06021d8c4ba37db30ef4c0b0b 100644 (file)
@@ -4595,6 +4595,7 @@ qemuProcessFetchGuestCPU(virDomainObj *vm,
                                 virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QOM_LIST_GET),
                                 cpuQOMPath,
                                 virQEMUCapsCPUFeatureFromQEMU,
+                                virQEMUCapsCPUFilterFeatures,
                                 &dataEnabled, &dataDisabled);
 
     qemuDomainObjExitMonitor(vm);
index 6129dde449aff82a74daa254edb8ae8276faa324..bfe81739a795ab7ceb24fb410c8ca1eb5ebc7355 100644 (file)
@@ -2809,6 +2809,7 @@ testQemuMonitorJSONGetGuestCPU(const void *opaque)
                                    data->qomListGet,
                                    "/machine/unattached/device[0]",
                                    virQEMUCapsCPUFeatureFromQEMU,
+                                   virQEMUCapsCPUFilterFeatures,
                                    &dataEnabled, &dataDisabled) < 0)
         return -1;