From: Jiri Denemark <jdene...@redhat.com> With qom-list-get we already have the value of unavailable-features property in the returned object (just like we have all values of all bool properties). Let's use the value from there instead of querying for it separately using qom-get.
After this patch only a single QMP command is used for getting all the required info about guest CPUs created by QEMU 10.1 or newer. Signed-off-by: Jiri Denemark <jdene...@redhat.com> --- src/qemu/qemu_monitor_json.c | 32 ++++++++++++++++--- .../get-guest-cpu-SierraForest.json | 23 ------------- .../get-guest-cpu-SkylakeClient.json | 14 -------- 3 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index f8be1a79b1..9345115241 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -6598,6 +6598,7 @@ struct _qemuMonitorJSONCPUPropsFilterData { qemuMonitor *mon; bool values; const char *cpuQOMPath; + virJSONValue *unavailableFeatures; }; static int @@ -6607,8 +6608,22 @@ qemuMonitorJSONCPUPropsFilter(const char *name, { struct _qemuMonitorJSONCPUPropsFilterData *data = opaque; bool enabled = false; + const char *type = virJSONValueObjectGetString(propData, "type"); - if (STRNEQ_NULLABLE(virJSONValueObjectGetString(propData, "type"), "bool")) + if (data->values && + STREQ(name, "unavailable-features") && + STREQ_NULLABLE(type, "strList")) { + data->unavailableFeatures = virJSONValueObjectGetArray(propData, "value"); + if (!data->unavailableFeatures) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("property '%1$s' in reply data was missing value"), + name); + return -1; + } + return 1; + } + + if (STRNEQ_NULLABLE(type, "bool")) return 1; if (data->values) { @@ -6651,6 +6666,7 @@ qemuMonitorJSONGetCPUProperties(qemuMonitor *mon, .mon = mon, .values = qomListGet, .cpuQOMPath = cpuQOMPath, + .unavailableFeatures = NULL, }; *propsEnabled = NULL; @@ -6704,10 +6720,16 @@ qemuMonitorJSONGetCPUProperties(qemuMonitor *mon, &filterData, propsEnabled) < 0) return -1; - if (qemuMonitorJSONGetStringListProperty(mon, cpuQOMPath, - "unavailable-features", - propsDisabled) < 0) - return -1; + if (filterData.unavailableFeatures) { + *propsDisabled = virJSONValueArrayToStringList(filterData.unavailableFeatures); + if (!*propsDisabled) + return -1; + } else { + if (qemuMonitorJSONGetStringListProperty(mon, cpuQOMPath, + "unavailable-features", + propsDisabled) < 0) + return -1; + } return 0; } diff --git a/tests/qemumonitorjsondata/get-guest-cpu-SierraForest.json b/tests/qemumonitorjsondata/get-guest-cpu-SierraForest.json index d64ae84532..f5c41cf9b6 100644 --- a/tests/qemumonitorjsondata/get-guest-cpu-SierraForest.json +++ b/tests/qemumonitorjsondata/get-guest-cpu-SierraForest.json @@ -2960,26 +2960,3 @@ ], "id": "libvirt-1" } - -{ - "execute": "qom-get", - "arguments": { - "path": "/machine/unattached/device[0]", - "property": "unavailable-features" - }, - "id": "libvirt-2" -} - -{ - "return": [ - "bus-lock-detect", - "cmpccxadd", - "avx-ifma", - "wbnoinvd", - "pbrsb-no", - "avx-vnni-int8", - "avx-ne-convert", - "mcdt-no" - ], - "id": "libvirt-2" -} diff --git a/tests/qemumonitorjsondata/get-guest-cpu-SkylakeClient.json b/tests/qemumonitorjsondata/get-guest-cpu-SkylakeClient.json index 76b66ded20..b5bea8fd61 100644 --- a/tests/qemumonitorjsondata/get-guest-cpu-SkylakeClient.json +++ b/tests/qemumonitorjsondata/get-guest-cpu-SkylakeClient.json @@ -2951,17 +2951,3 @@ ], "id": "libvirt-1" } - -{ - "execute": "qom-get", - "arguments": { - "path": "/machine/unattached/device[0]", - "property": "unavailable-features" - }, - "id": "libvirt-2" -} - -{ - "return": [], - "id": "libvirt-2" -} -- 2.51.0