]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Move feature filtering to qemuMonitorJSONGetCPUProperties
authorJiri Denemark <jdenemar@redhat.com>
Wed, 27 Aug 2025 10:29:57 +0000 (12:29 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 8 Sep 2025 13:32:47 +0000 (15:32 +0200)
When getting enabled CPU features (qemuMonitorJSONGetCPUData), we used
to call qemuMonitorJSONGetCPUProperties to get the list of all boolean
properties and then queried their values and ignored properties that
were not true. By moving the filtering inside
qemuMonitorJSONGetCPUProperties we don't need to even add disabled
features to any list and also get ready for better QMP interface.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_monitor_json.c

index 0c78115e9d68b4f47be7e7016a08ea3bc218b917..be7ad21eca4227caa72d043eec8adc15769b7592 100644 (file)
@@ -6595,14 +6595,29 @@ qemuMonitorJSONGetDeviceAliases(qemuMonitor *mon,
 }
 
 
+struct _qemuMonitorJSONCPUPropsFilterData {
+    qemuMonitor *mon;
+    const char *cpuQOMPath;
+};
+
 static int
-qemuMonitorJSONCPUPropsFilter(const char *name G_GNUC_UNUSED,
+qemuMonitorJSONCPUPropsFilter(const char *name,
                               virJSONValue *propData,
-                              void *data G_GNUC_UNUSED)
+                              void *opaque)
 {
+    qemuMonitorJSONObjectProperty prop = { .type = QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN };
+    struct _qemuMonitorJSONCPUPropsFilterData *data = opaque;
+
     if (STRNEQ_NULLABLE(virJSONValueObjectGetString(propData, "type"), "bool"))
         return 1;
 
+    if (qemuMonitorJSONGetObjectProperty(data->mon, data->cpuQOMPath,
+                                         name, &prop) < 0)
+        return -1;
+
+    if (!prop.val.b)
+        return 1;
+
     return 0;
 }
 
@@ -6614,6 +6629,10 @@ qemuMonitorJSONGetCPUProperties(qemuMonitor *mon,
 {
     g_autoptr(virJSONValue) cmd = NULL;
     g_autoptr(virJSONValue) reply = NULL;
+    struct _qemuMonitorJSONCPUPropsFilterData filterData = {
+        .mon = mon,
+        .cpuQOMPath = cpuQOMPath,
+    };
 
     *props = NULL;
 
@@ -6629,7 +6648,7 @@ qemuMonitorJSONGetCPUProperties(qemuMonitor *mon,
         return 0;
 
     return qemuMonitorJSONParsePropsList(cmd, reply,
-                                         qemuMonitorJSONCPUPropsFilter, NULL,
+                                         qemuMonitorJSONCPUPropsFilter, &filterData,
                                          props);
 }
 
@@ -6640,7 +6659,6 @@ qemuMonitorJSONGetCPUData(qemuMonitor *mon,
                           qemuMonitorCPUFeatureTranslationCallback translate,
                           virCPUData *data)
 {
-    qemuMonitorJSONObjectProperty prop = { .type = QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN };
     g_auto(GStrv) props = NULL;
     char **p;
 
@@ -6650,12 +6668,6 @@ qemuMonitorJSONGetCPUData(qemuMonitor *mon,
     for (p = props; p && *p; p++) {
         const char *name = *p;
 
-        if (qemuMonitorJSONGetObjectProperty(mon, cpuQOMPath, name, &prop) < 0)
-            return -1;
-
-        if (!prop.val.b)
-            continue;
-
         if (translate)
             name = translate(data->arch, name);