From: Peter Krempa Date: Mon, 27 Feb 2023 13:45:47 +0000 (+0100) Subject: qemu: capabilities: Extract whether machine type supports ACPI X-Git-Tag: v9.2.0-rc1~210 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=795642b985d6284bb5b464746c2e820720b80e87;p=thirdparty%2Flibvirt.git qemu: capabilities: Extract whether machine type supports ACPI The return data from 'query-machines' now contains an 'acpi' field. If the field is present we can use it to decide how to handle user's setting of '' domain feature. Add logic to extract the 'acpi' field and store it in machine type list along with other properties. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 793fd351ca..fdb45f6bca 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -704,6 +704,7 @@ struct _virQEMUCapsMachineType { bool numaMemSupported; char *defaultRAMid; bool deprecated; + virTristateBool acpi; }; typedef struct _virQEMUCapsHostCPUData virQEMUCapsHostCPUData; @@ -1964,6 +1965,7 @@ virQEMUCapsAccelCopyMachineTypes(virQEMUCapsAccel *dst, dst->machineTypes[i].numaMemSupported = src->machineTypes[i].numaMemSupported; dst->machineTypes[i].defaultRAMid = g_strdup(src->machineTypes[i].defaultRAMid); dst->machineTypes[i].deprecated = src->machineTypes[i].deprecated; + dst->machineTypes[i].acpi = src->machineTypes[i].acpi; } } @@ -2783,7 +2785,8 @@ virQEMUCapsAddMachine(virQEMUCaps *qemuCaps, bool isDefault, bool numaMemSupported, const char *defaultRAMid, - bool deprecated) + bool deprecated, + virTristateBool acpi) { virQEMUCapsAccel *accel = virQEMUCapsGetAccel(qemuCaps, virtType); virQEMUCapsMachineType *mach; @@ -2807,6 +2810,7 @@ virQEMUCapsAddMachine(virQEMUCaps *qemuCaps, mach->defaultRAMid = g_strdup(defaultRAMid); mach->deprecated = deprecated; + mach->acpi = acpi; } /** @@ -2857,7 +2861,8 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCaps *qemuCaps, machines[i]->isDefault, machines[i]->numaMemSupported, machines[i]->defaultRAMid, - machines[i]->deprecated); + machines[i]->deprecated, + machines[i]->acpi); if (preferredMachine && (STREQ_NULLABLE(machines[i]->alias, preferredMachine) || @@ -4214,6 +4219,9 @@ virQEMUCapsLoadMachines(virQEMUCapsAccel *caps, return -1; virTristateBoolToBool(tmp, &caps->machineTypes[i].deprecated); + + if (virXMLPropTristateBool(nodes[i], "acpi", VIR_XML_PROP_NONE, &caps->machineTypes[i].acpi) < 0) + return -1; } return 0; @@ -4907,6 +4915,11 @@ virQEMUCapsFormatMachines(virQEMUCapsAccel *caps, caps->machineTypes[i].defaultRAMid); if (caps->machineTypes[i].deprecated) virBufferAddLit(buf, " deprecated='yes'"); + + if (caps->machineTypes[i].acpi != VIR_TRISTATE_BOOL_ABSENT) + virBufferAsprintf(buf, " acpi='%s'", + virTristateBoolTypeToString(caps->machineTypes[i].acpi)); + virBufferAddLit(buf, "/>\n"); } } @@ -6943,7 +6956,7 @@ virQEMUCapsStripMachineAliasesForVirtType(virQEMUCaps *qemuCaps, virQEMUCapsAddMachine(qemuCaps, virtType, name, NULL, mach->defaultCPU, mach->maxCpus, mach->hotplugCpus, mach->qemuDefault, mach->numaMemSupported, mach->defaultRAMid, - mach->deprecated); + mach->deprecated, mach->acpi); } } } diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h index 87368536ea..720435f762 100644 --- a/src/qemu/qemu_capspriv.h +++ b/src/qemu/qemu_capspriv.h @@ -117,4 +117,5 @@ virQEMUCapsAddMachine(virQEMUCaps *qemuCaps, bool isDefault, bool numaMemSupported, const char *defaultRAMid, - bool deprecated); + bool deprecated, + virTristateBool acpi); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 2fa06b99a3..72db0c0838 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1082,6 +1082,7 @@ struct _qemuMonitorMachineInfo { bool numaMemSupported; char *defaultRAMid; bool deprecated; + virTristateBool acpi; }; int qemuMonitorGetMachines(qemuMonitor *mon, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 2fe3f696c8..ee2ea68acb 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -4822,6 +4822,18 @@ int qemuMonitorJSONGetMachines(qemuMonitor *mon, if (virJSONValueObjectHasKey(child, "deprecated") && virJSONValueObjectGetBoolean(child, "deprecated", &info->deprecated) < 0) goto cleanup; + + if (virJSONValueObjectHasKey(child, "acpi")) { + bool acpi; + + if (virJSONValueObjectGetBoolean(child, "acpi", &acpi) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("qemu-machines reply has malformed 'acpi data")); + goto cleanup; + } + + info->acpi = virTristateBoolFromBool(acpi); + } } ret = n; diff --git a/tests/qemucapabilitiesdata/caps_8.0.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_8.0.0.x86_64.xml index 34ab392451..ee69898a54 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0.x86_64.xml @@ -1589,66 +1589,66 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3384,66 +3384,66 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 396803c40b..e47e93e8a6 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -458,7 +458,8 @@ qemuTestCapsPopulateFakeMachines(virQEMUCaps *caps, false, true, defaultRAMid, - false); + false, + VIR_TRISTATE_BOOL_ABSENT); virQEMUCapsSet(caps, QEMU_CAPS_TCG); } @@ -475,7 +476,8 @@ qemuTestCapsPopulateFakeMachines(virQEMUCaps *caps, false, true, defaultRAMid, - false); + false, + VIR_TRISTATE_BOOL_ABSENT); virQEMUCapsSet(caps, QEMU_CAPS_KVM); } } @@ -494,7 +496,8 @@ qemuTestCapsPopulateFakeMachines(virQEMUCaps *caps, false, true, defaultRAMid, - false); + false, + VIR_TRISTATE_BOOL_ABSENT); virQEMUCapsSet(caps, QEMU_CAPS_HVF); } }