7f40b47bc6
- Synchronize with libvirt-10.5.0-4.el9 (RHEL-30177) - qemu: virtiofs: cache: use 'never' instead of 'none' - qemu_domain: Strip <acpi/> from s390(x) definitions - qemuxmlconftest: Add tests for the ACPI stripping hack on s390 - vsh: Allow vshReadlineInit() to be called multiple times Related: RHEL-30177
106 lines
4.1 KiB
Diff
106 lines
4.1 KiB
Diff
From f34372c108e5b4f1e37c333a7ff2c50faa9f534e Mon Sep 17 00:00:00 2001
|
|
Message-ID: <f34372c108e5b4f1e37c333a7ff2c50faa9f534e.1723213495.git.jdenemar@redhat.com>
|
|
From: Peter Krempa <pkrempa@redhat.com>
|
|
Date: Wed, 31 Jul 2024 11:34:59 +0200
|
|
Subject: [PATCH] qemu_domain: Strip <acpi/> from s390(x) definitions
|
|
|
|
The s390(x) machines never supported ACPI. That didn't stop users
|
|
enabling ACPI in their config. As of libvirt-9.2 (98c4e3d073) with new
|
|
enough qemu we reject configs which require ACPI, but qemu can't satisfy
|
|
it.
|
|
|
|
This breaks migration of existing VMs with the old wrong configs to new
|
|
libvirt installations.
|
|
|
|
To address this introduce a post-parse fixup removing the ACPI flag
|
|
specifically for s390 machines which do enable it in the definition.
|
|
|
|
The advantage of doing it in post-parse, rather than simply relaxing the
|
|
ABI stability check to allow users providing an fixed XML when migrating
|
|
(allowing change of the ACPI flag for s390 in ABI stability check, as it
|
|
doesn't impact ABI), is that only the destination installation needs to
|
|
be patched in order to preserve migration.
|
|
|
|
To mitigate the disadvantage of simply stripping it from all s390(x)
|
|
configs the hack is not applied when defining or starting a new domain
|
|
from the XML, to preserve the error about unsupported configuration.
|
|
|
|
Resolves: https://issues.redhat.com/browse/RHEL-49516
|
|
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
|
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
|
|
Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
|
|
(cherry picked from commit 4ba4f659e42a30c3fa8ece414616a23a992acfaa)
|
|
---
|
|
src/qemu/qemu_domain.c | 49 ++++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 49 insertions(+)
|
|
|
|
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
|
index 1a90311ca5..1bafe3708a 100644
|
|
--- a/src/qemu/qemu_domain.c
|
|
+++ b/src/qemu/qemu_domain.c
|
|
@@ -5013,6 +5013,53 @@ qemuDomainDefPostParseBasic(virDomainDef *def,
|
|
}
|
|
|
|
|
|
+/**
|
|
+ * qemuDomainDefACPIPostParse:
|
|
+ * @def: domain definition
|
|
+ * @qemuCaps: qemu capabilities object
|
|
+ *
|
|
+ * Fixup the use of ACPI flag on certain architectures that never supported it
|
|
+ * and users for some reason used it, which would break migration to newer
|
|
+ * libvirt versions which check whether given machine type supports ACPI.
|
|
+ *
|
|
+ * The fixup is done in post-parse as it's hard to update the ABI stability
|
|
+ * check on source of the migration.
|
|
+ */
|
|
+static void
|
|
+qemuDomainDefACPIPostParse(virDomainDef *def,
|
|
+ virQEMUCaps *qemuCaps,
|
|
+ unsigned int parseFlags)
|
|
+{
|
|
+ /* Only cases when ACPI is enabled need to be fixed up */
|
|
+ if (def->features[VIR_DOMAIN_FEATURE_ACPI] != VIR_TRISTATE_SWITCH_ON)
|
|
+ return;
|
|
+
|
|
+ /* Strip the <acpi/> feature only for non-fresh configs, in order to still
|
|
+ * produce an error if the feature is present in a newly defined one.
|
|
+ *
|
|
+ * The use of the VIR_DOMAIN_DEF_PARSE_ABI_UPDATE looks counter-intuitive,
|
|
+ * but it's used only in qemuDomainCreateXML/qemuDomainDefineXMLFlags APIs
|
|
+ * */
|
|
+ if (parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE)
|
|
+ return;
|
|
+
|
|
+ /* This fixup is applicable _only_ on architectures which were present as of
|
|
+ * libvirt-9.2 and *never* supported ACPI. The fixup is currently done only
|
|
+ * for existing users of s390(x) to fix migration for configs which had
|
|
+ * <acpi/> despite being ignored.
|
|
+ */
|
|
+ if (def->os.arch != VIR_ARCH_S390 &&
|
|
+ def->os.arch != VIR_ARCH_S390X)
|
|
+ return;
|
|
+
|
|
+ /* To be sure, we only strip ACPI if given machine type doesn't support it */
|
|
+ if (virQEMUCapsMachineSupportsACPI(qemuCaps, def->virtType, def->os.machine) != VIR_TRISTATE_BOOL_NO)
|
|
+ return;
|
|
+
|
|
+ def->features[VIR_DOMAIN_FEATURE_ACPI] = VIR_TRISTATE_SWITCH_ABSENT;
|
|
+}
|
|
+
|
|
+
|
|
static int
|
|
qemuDomainDefPostParse(virDomainDef *def,
|
|
unsigned int parseFlags,
|
|
@@ -5033,6 +5080,8 @@ qemuDomainDefPostParse(virDomainDef *def,
|
|
if (qemuDomainDefMachinePostParse(def, qemuCaps) < 0)
|
|
return -1;
|
|
|
|
+ qemuDomainDefACPIPostParse(def, qemuCaps, parseFlags);
|
|
+
|
|
if (qemuDomainDefBootPostParse(def, driver, parseFlags) < 0)
|
|
return -1;
|
|
|
|
--
|
|
2.46.0
|