[PATCH 0/5] Allow 'optional' on async-teardown

Adding the value 'optional' to attribute 'enabled' on the element async-teardown to provide the optional use of the feature if it is provided by QEMU. Boris Fiuczynski (5): schemas: Add virYesNoOptional util: Add virQuadstateOption and helpers virxml: Add virXMLPropQuadstateOption conf: Add 'optional' to feature async-teardown conf: Ensure migratability if enabled is 'optional' docs/formatdomain.rst | 7 +-- src/conf/domain_conf.c | 22 +++++---- src/conf/schemas/basictypes.rng | 8 ++++ src/conf/schemas/domaincommon.rng | 2 +- src/libvirt_private.syms | 1 + src/qemu/qemu_command.c | 6 ++- src/qemu/qemu_process.c | 18 ++++++++ src/qemu/qemu_validate.c | 2 +- src/util/virenum.c | 46 +++++++++++++++++++ src/util/virenum.h | 15 ++++++ src/util/virxml.c | 28 +++++++++++ src/util/virxml.h | 7 +++ ...0-async-teardown-optional.s390x-6.0.0.args | 35 ++++++++++++++ ...-async-teardown-optional.s390x-latest.args | 36 +++++++++++++++ .../s390-async-teardown-optional.xml | 24 ++++++++++ tests/qemuxml2argvtest.c | 2 + 16 files changed, 243 insertions(+), 16 deletions(-) create mode 100644 tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-6.0.0.args create mode 100644 tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-async-teardown-optional.xml -- 2.41.0

Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com> --- src/conf/schemas/basictypes.rng | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/conf/schemas/basictypes.rng b/src/conf/schemas/basictypes.rng index 2d6f1a2c84..97d7ad7caf 100644 --- a/src/conf/schemas/basictypes.rng +++ b/src/conf/schemas/basictypes.rng @@ -603,6 +603,14 @@ </choice> </define> + <define name="virYesNoOptional"> + <choice> + <value>yes</value> + <value>no</value> + <value>optional</value> + </choice> + </define> + <define name="virOnOff"> <choice> <value>on</value> -- 2.41.0

Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com> --- src/util/virenum.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/util/virenum.h | 15 +++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/util/virenum.c b/src/util/virenum.c index c6936e58ff..8474db9b2b 100644 --- a/src/util/virenum.c +++ b/src/util/virenum.c @@ -35,6 +35,14 @@ VIR_ENUM_IMPL(virTristateSwitch, "off", ); +VIR_ENUM_IMPL(virQuadstateOption, + VIR_QUADSTATE_OPTION_LAST, + "default", + "yes", + "no", + "optional", +); + virTristateBool virTristateBoolFromBool(bool val) @@ -110,6 +118,44 @@ virTristateSwitchToBool(virTristateSwitch t, } +virQuadstateOption +virQuadstateOptionFromBool(bool val) +{ + if (val) + return VIR_QUADSTATE_OPTION_YES; + else + return VIR_QUADSTATE_OPTION_NO; +} + + +/** + * virQuadstateOptionToBool: + * @t: a virQuadstateOption value + * @b: pointer to a boolean to be updated according to the value of @t + * + * The value pointed to by @b is updated if the quadstate value @t is neither absent or optional. + */ +void +virQuadstateOptionToBool(virQuadstateOption t, + bool *b) +{ + switch (t) { + case VIR_QUADSTATE_OPTION_YES: + *b = true; + break; + + case VIR_QUADSTATE_OPTION_NO: + *b = false; + break; + + case VIR_QUADSTATE_OPTION_ABSENT: + case VIR_QUADSTATE_OPTION_OPTIONAL: + case VIR_QUADSTATE_OPTION_LAST: + break; + } +} + + int virEnumFromString(const char * const *types, unsigned int ntypes, diff --git a/src/util/virenum.h b/src/util/virenum.h index 98f01d574d..bd45d470c4 100644 --- a/src/util/virenum.h +++ b/src/util/virenum.h @@ -64,16 +64,31 @@ typedef enum { VIR_TRISTATE_SWITCH_LAST } virTristateSwitch; +typedef enum { + VIR_QUADSTATE_OPTION_ABSENT = 0, + VIR_QUADSTATE_OPTION_YES, + VIR_QUADSTATE_OPTION_NO, + VIR_QUADSTATE_OPTION_OPTIONAL, + + VIR_QUADSTATE_OPTION_LAST +} virQuadstateOption; + VIR_ENUM_DECL(virTristateBool); VIR_ENUM_DECL(virTristateSwitch); +VIR_ENUM_DECL(virQuadstateOption); virTristateBool virTristateBoolFromBool(bool val); void virTristateBoolToBool(virTristateBool t, bool *b); virTristateSwitch virTristateSwitchFromBool(bool val); void virTristateSwitchToBool(virTristateSwitch t, bool *b); +virQuadstateOption virQuadstateOptionFromBool(bool val); +void virQuadstateOptionToBool(virQuadstateOption t, bool *b); /* the two enums must be in sync to be able to use helpers interchangeably in * some special cases */ G_STATIC_ASSERT((int)VIR_TRISTATE_BOOL_YES == (int)VIR_TRISTATE_SWITCH_ON); G_STATIC_ASSERT((int)VIR_TRISTATE_BOOL_NO == (int)VIR_TRISTATE_SWITCH_OFF); G_STATIC_ASSERT((int)VIR_TRISTATE_BOOL_ABSENT == (int)VIR_TRISTATE_SWITCH_ABSENT); +G_STATIC_ASSERT((int)VIR_QUADSTATE_OPTION_YES == (int)VIR_TRISTATE_SWITCH_ON); +G_STATIC_ASSERT((int)VIR_QUADSTATE_OPTION_NO == (int)VIR_TRISTATE_SWITCH_OFF); +G_STATIC_ASSERT((int)VIR_QUADSTATE_OPTION_ABSENT == (int)VIR_TRISTATE_SWITCH_ABSENT); -- 2.41.0

Convenience function to return the value of a yes / no / optional XML attribute. Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com> --- src/libvirt_private.syms | 1 + src/util/virxml.c | 28 ++++++++++++++++++++++++++++ src/util/virxml.h | 7 +++++++ 3 files changed, 36 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index da60c965dd..3c9d4a4b04 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3720,6 +3720,7 @@ virXMLPropEnum; virXMLPropEnumDefault; virXMLPropInt; virXMLPropLongLong; +virXMLPropQuadstateOption; virXMLPropString; virXMLPropStringRequired; virXMLPropTristateBool; diff --git a/src/util/virxml.c b/src/util/virxml.c index 0c1eae8c3c..d0f554fab5 100644 --- a/src/util/virxml.c +++ b/src/util/virxml.c @@ -475,6 +475,34 @@ virXMLPropTristateSwitch(xmlNodePtr node, } +/** + * virXMLPropQuadstateOption: + * @node: XML dom node pointer + * @name: Name of the property (attribute) to get + * @flags: Bitwise-OR of virXMLPropFlags + * @result: The returned value + * + * Convenience function to return value of a yes / no / optional attribute. + * In case when the property is missing @result is initialized to + * VIR_QUADSTATE_OPTION_ABSENT. + * + * Returns 1 in case of success in which case @result is set, + * or 0 if the attribute is not present, + * or -1 and reports an error on failure. + */ +int +virXMLPropQuadstateOption(xmlNodePtr node, + const char *name, + virXMLPropFlags flags, + virQuadstateOption *result) +{ + flags |= VIR_XML_PROP_NONZERO; + + return virXMLPropEnumInternal(node, name, virQuadstateOptionTypeFromString, + flags, result, VIR_QUADSTATE_OPTION_ABSENT); +} + + /** * virXMLPropInt: * @node: XML dom node pointer diff --git a/src/util/virxml.h b/src/util/virxml.h index 7af47437bd..901c82e6e3 100644 --- a/src/util/virxml.h +++ b/src/util/virxml.h @@ -120,6 +120,13 @@ virXMLPropTristateSwitch(xmlNodePtr node, virTristateSwitch *result) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); +int +virXMLPropQuadstateOption(xmlNodePtr node, + const char *name, + virXMLPropFlags flags, + virQuadstateOption *result) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); + int virXMLPropInt(xmlNodePtr node, const char *name, -- 2.41.0

Allow to use 'optional' on attribute 'enabled' of async-teardown. This allows a user to exploit the feature if it is provided by QEMU. Also adding tests and documentation. Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com> --- docs/formatdomain.rst | 7 ++-- src/conf/domain_conf.c | 14 ++++---- src/conf/schemas/domaincommon.rng | 2 +- src/qemu/qemu_command.c | 6 ++-- src/qemu/qemu_process.c | 18 ++++++++++ src/qemu/qemu_validate.c | 2 +- ...0-async-teardown-optional.s390x-6.0.0.args | 35 ++++++++++++++++++ ...-async-teardown-optional.s390x-latest.args | 36 +++++++++++++++++++ .../s390-async-teardown-optional.xml | 24 +++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 10 files changed, 132 insertions(+), 14 deletions(-) create mode 100644 tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-6.0.0.args create mode 100644 tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-async-teardown-optional.xml diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index cd9cb02bf8..61f90e1f11 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2232,9 +2232,10 @@ are: =========== ============================================== =================================================== ============== ``async-teardown`` - Depending on the ``enabled`` attribute (values ``yes``, ``no``) enable or - disable QEMU asynchronous teardown to improve memory reclaiming on a guest. - :since:`Since 9.6.0` (QEMU only) + Depending on the ``enabled`` attribute (values ``yes``, ``no``, ``optional``) + enable or disable QEMU asynchronous teardown to improve memory reclaiming on + a guest. Setting ``optional`` will enable the feature if QEMU supports the + feature and otherwise disable it. :since:`Since 9.6.0` (QEMU only) Time keeping ------------ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 47693a49bf..7191e37a6c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -16691,14 +16691,14 @@ virDomainFeaturesDefParse(virDomainDef *def, break; case VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN: { - virTristateBool enabled; + virQuadstateOption enabled; - if (virXMLPropTristateBool(nodes[i], "enabled", - VIR_XML_PROP_NONE, &enabled) < 0) + if (virXMLPropQuadstateOption(nodes[i], "enabled", + VIR_XML_PROP_NONE, &enabled) < 0) return -1; - if (enabled == VIR_TRISTATE_BOOL_ABSENT) - enabled = VIR_TRISTATE_BOOL_YES; + if (enabled == VIR_QUADSTATE_OPTION_ABSENT) + enabled = VIR_QUADSTATE_OPTION_YES; def->features[val] = enabled; break; @@ -27357,9 +27357,9 @@ virDomainDefFormatFeatures(virBuffer *buf, break; case VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN: - if (def->features[i] != VIR_TRISTATE_SWITCH_ABSENT) + if (def->features[i] != VIR_QUADSTATE_OPTION_ABSENT) virBufferAsprintf(&childBuf, "<async-teardown enabled='%s'/>\n", - virTristateBoolTypeToString(def->features[i])); + virQuadstateOptionTypeToString(def->features[i])); break; case VIR_DOMAIN_FEATURE_LAST: diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index c2f56b0490..cc116a8b24 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -6664,7 +6664,7 @@ <element name="async-teardown"> <optional> <attribute name="enabled"> - <ref name="virYesNo"/> + <ref name="virYesNoOptional"/> </attribute> </optional> </element> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 77c5335bde..ef5e2c5239 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10195,10 +10195,12 @@ qemuBuildAsyncTeardownCommandLine(virCommand *cmd, virQEMUCaps *qemuCaps) { g_autofree char *async = NULL; - virTristateBool enabled = def->features[VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN]; + virQuadstateOption enabled = def->features[VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN]; - if (enabled != VIR_TRISTATE_BOOL_ABSENT && + if (enabled != VIR_QUADSTATE_OPTION_ABSENT && virQEMUCapsGet(qemuCaps, QEMU_CAPS_RUN_WITH_ASYNC_TEARDOWN)) { + if (enabled == VIR_QUADSTATE_OPTION_OPTIONAL) + enabled = VIR_QUADSTATE_OPTION_YES; async = g_strdup_printf("async-teardown=%s", virTristateSwitchTypeToString(enabled)); virCommandAddArgList(cmd, "-run-with", async, NULL); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 0644f80161..7db6e0069e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6591,6 +6591,19 @@ qemuProcessUpdateSEVInfo(virDomainObj *vm) } +static void +qemuProcessUpdateAsyncTeardown(virDomainObj *vm) +{ + virDomainDef *def = vm->def; + qemuDomainObjPrivate *priv = vm->privateData; + + if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_RUN_WITH_ASYNC_TEARDOWN)) + def->features[VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN] = VIR_QUADSTATE_OPTION_YES; + else + def->features[VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN] = VIR_QUADSTATE_OPTION_NO; +} + + /* qemuProcessPrepareChardevSource: * @def: live domain definition * @cfg: driver configuration @@ -6752,6 +6765,11 @@ qemuProcessPrepareDomain(virQEMUDriver *driver, return -1; } + if (vm->def->features[VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN] == VIR_QUADSTATE_OPTION_OPTIONAL) { + VIR_DEBUG("Prepare feature async-teardown enablement from optional"); + qemuProcessUpdateAsyncTeardown(vm); + } + return 0; } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index d5c2b2cd44..fe010397ba 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -220,7 +220,7 @@ qemuValidateDomainDefFeatures(const virDomainDef *def, break; case VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN: - if (def->features[i] == VIR_TRISTATE_BOOL_YES && + if (def->features[i] == VIR_QUADSTATE_OPTION_YES && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_RUN_WITH_ASYNC_TEARDOWN)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("asynchronous teardown is not available with this QEMU binary")); diff --git a/tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-6.0.0.args b/tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-6.0.0.args new file mode 100644 index 0000000000..57690530a2 --- /dev/null +++ b/tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-6.0.0.args @@ -0,0 +1,35 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-s390x \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine s390-ccw-virtio-6.0,usb=off,dump-guest-core=off,memory-backend=s390.ram \ +-accel tcg \ +-cpu qemu \ +-m size=262144k \ +-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device virtio-serial-ccw,id=virtio-serial0,devno=fe.0.0000 \ +-chardev pty,id=charconsole0 \ +-device virtconsole,chardev=charconsole0,id=console0 \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0001 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-latest.args b/tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-latest.args new file mode 100644 index 0000000000..cc7866499f --- /dev/null +++ b/tests/qemuxml2argvdata/s390-async-teardown-optional.s390x-latest.args @@ -0,0 +1,36 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-s390x \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine s390-ccw-virtio,usb=off,dump-guest-core=off,memory-backend=s390.ram \ +-accel tcg \ +-cpu qemu \ +-m size=262144k \ +-object '{"qom-type":"memory-backend-ram","id":"s390.ram","size":268435456}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"virtio-serial-ccw","id":"virtio-serial0","devno":"fe.0.0000"}' \ +-chardev pty,id=charconsole0 \ +-device '{"driver":"virtconsole","chardev":"charconsole0","id":"console0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-ccw","id":"balloon0","devno":"fe.0.0001"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-run-with async-teardown=on \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/s390-async-teardown-optional.xml b/tests/qemuxml2argvdata/s390-async-teardown-optional.xml new file mode 100644 index 0000000000..6e4fe3b1dd --- /dev/null +++ b/tests/qemuxml2argvdata/s390-async-teardown-optional.xml @@ -0,0 +1,24 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>9aa4b45c-b9dd-45ef-91fe-862b27b4231f</uuid> + <memory>262144</memory> + <currentMemory>262144</currentMemory> + <os> + <type arch='s390x' machine='s390-ccw-virtio'>hvm</type> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <features> + <async-teardown enabled='optional'/> + </features> + <devices> + <emulator>/usr/bin/qemu-system-s390x</emulator> + <controller type='virtio-serial' index='0'> + </controller> + <console type='pty'> + <target type='virtio'/> + </console> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index c44b9bc494..1a84ac1526 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2705,6 +2705,8 @@ mymain(void) DO_TEST_CAPS_ARCH_VER_PARSE_ERROR("s390-async-teardown", "s390x", "6.0.0"); DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown-disabled", "s390x"); DO_TEST_CAPS_ARCH_VER("s390-async-teardown-disabled", "s390x", "6.0.0"); + DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown-optional", "s390x"); + DO_TEST_CAPS_ARCH_VER("s390-async-teardown-optional", "s390x", "6.0.0"); qemuTestDriverFree(&driver); virFileWrapperClearPrefixes(); -- 2.41.0

If 'optional' is set on enabled and a migratable domain XML is requested the 'optional' value is removed. Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com> --- src/conf/domain_conf.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7191e37a6c..6f451a9bfe 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -27019,7 +27019,8 @@ virDomainFeatureTCGFormat(virBuffer *buf, static int virDomainDefFormatFeatures(virBuffer *buf, - virDomainDef *def) + virDomainDef *def, + bool migratable) { g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); size_t i; @@ -27357,6 +27358,9 @@ virDomainDefFormatFeatures(virBuffer *buf, break; case VIR_DOMAIN_FEATURE_ASYNC_TEARDOWN: + if (migratable && def->features[i] == VIR_QUADSTATE_OPTION_OPTIONAL) + break; + if (def->features[i] != VIR_QUADSTATE_OPTION_ABSENT) virBufferAsprintf(&childBuf, "<async-teardown enabled='%s'/>\n", virQuadstateOptionTypeToString(def->features[i])); @@ -27649,7 +27653,7 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def, virBufferAddLit(buf, "</idmap>\n"); } - if (virDomainDefFormatFeatures(buf, def) < 0) + if (virDomainDefFormatFeatures(buf, def, migratable) < 0) return -1; if (virCPUDefFormatBufFull(buf, def->cpu, def->numa) < 0) -- 2.41.0

On Wed, Aug 09, 2023 at 10:49:42AM +0200, Boris Fiuczynski wrote:
Adding the value 'optional' to attribute 'enabled' on the element async-teardown to provide the optional use of the feature if it is provided by QEMU.
This is not something we would typically do. IIUC, this is already exposed in the domain capabilities XML, so mgmt apps can query whether the feature is supported or not. They should already be doing this as they can't assume libvirt itself supports this feature With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
participants (2)
-
Boris Fiuczynski
-
Daniel P. Berrangé