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 '<acpi/>' domain feature. Add logic to extract the 'acpi' field and store it in machine type list along with other properties. --- src/qemu/qemu_capabilities.c | 19 ++++++++++++++++--- src/qemu/qemu_capspriv.h | 3 ++- src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 12 ++++++++++++ tests/testutilsqemu.c | 9 ++++++--- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 836c06f2ac..b81fecc834 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -705,6 +705,7 @@ struct _virQEMUCapsMachineType { bool numaMemSupported; char *defaultRAMid; bool deprecated; + virTristateBool acpi; }; typedef struct _virQEMUCapsHostCPUData virQEMUCapsHostCPUData; @@ -1967,6 +1968,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; } } @@ -2786,7 +2788,8 @@ virQEMUCapsAddMachine(virQEMUCaps *qemuCaps, bool isDefault, bool numaMemSupported, const char *defaultRAMid, - bool deprecated) + bool deprecated, + virTristateBool acpi) { virQEMUCapsAccel *accel = virQEMUCapsGetAccel(qemuCaps, virtType); virQEMUCapsMachineType *mach; @@ -2810,6 +2813,7 @@ virQEMUCapsAddMachine(virQEMUCaps *qemuCaps, mach->defaultRAMid = g_strdup(defaultRAMid); mach->deprecated = deprecated; + mach->acpi = acpi; } /** @@ -2860,7 +2864,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) || @@ -4218,6 +4223,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; @@ -4911,6 +4919,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"); } } @@ -6951,7 +6964,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 e81b464eea..20e3737c03 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/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); } } -- 2.39.2