From: Jiri Denemark <[email protected]>

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 <[email protected]>
---
 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.51.0

Reply via email to