From 132548efde76defaca54f90cc9c8a57508a4a86f Mon Sep 17 00:00:00 2001 From: Andrea Bolognani Date: Thu, 1 Feb 2018 17:52:48 +0100 Subject: [PATCH] qemu: Fix GIC behavior for the default case When no GIC version is specified, we currently default to GIC v2; however, that's not a great default, since guests will fail to start if the hardware only supports GIC v3. Change the behavior so that a sensible default is chosen instead. That basically means using the same algorithm whether the user didn't explicitly enable the GIC feature or they explicitly enabled it but didn't specify any GIC version. Signed-off-by: Andrea Bolognani Reviewed-by: John Ferlan --- src/qemu/qemu_domain.c | 28 +++++++++---------- .../aarch64-gic-default-both.args | 2 +- .../aarch64-gic-default-v3.args | 2 +- .../aarch64-gic-default-both.xml | 2 +- .../aarch64-gic-default-v3.xml | 2 +- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 59491fc21c..e943c67554 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2927,13 +2927,14 @@ static void qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) { - virGICVersion version; - - /* The virt machine type always uses GIC: if the relevant element + /* The virt machine type always uses GIC: if the relevant information * was not included in the domain XML, we need to choose a suitable * GIC version ourselves */ - if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ABSENT && - qemuDomainIsVirt(def)) { + if ((def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ABSENT && + qemuDomainIsVirt(def)) || + (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON && + def->gic_version == VIR_GIC_VERSION_NONE)) { + virGICVersion version; VIR_DEBUG("Looking for usable GIC version in domain capabilities"); for (version = VIR_GIC_VERSION_LAST - 1; @@ -2948,9 +2949,6 @@ qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def, * and rely on the code below to pick the default version, GICv2, * which supports all the features we need. * - * We'll want to revisit this once MSI support for GICv3 has been - * implemented in QEMU. - * * See https://bugzilla.redhat.com/show_bug.cgi?id=1414081 */ if (version == VIR_GIC_VERSION_3 && def->virtType == VIR_DOMAIN_VIRT_QEMU) { @@ -2967,17 +2965,17 @@ qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def, } } + /* Use the default GIC version (GICv2) as a last-ditch attempt + * if no match could be found above */ + if (def->gic_version == VIR_GIC_VERSION_NONE) { + VIR_DEBUG("Using GIC version 2 (default)"); + def->gic_version = VIR_GIC_VERSION_2; + } + /* Even if we haven't found a usable GIC version in the domain * capabilities, we still want to enable this */ def->features[VIR_DOMAIN_FEATURE_GIC] = VIR_TRISTATE_SWITCH_ON; } - - /* Use the default GIC version (GICv2) if no version was specified */ - if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON && - def->gic_version == VIR_GIC_VERSION_NONE) { - VIR_DEBUG("Using GIC version 2 (default)"); - def->gic_version = VIR_GIC_VERSION_2; - } } diff --git a/tests/qemuxml2argvdata/aarch64-gic-default-both.args b/tests/qemuxml2argvdata/aarch64-gic-default-both.args index 04ecd4ce76..6209eff4b0 120000 --- a/tests/qemuxml2argvdata/aarch64-gic-default-both.args +++ b/tests/qemuxml2argvdata/aarch64-gic-default-both.args @@ -1 +1 @@ -aarch64-gic-v2.args \ No newline at end of file +aarch64-gic-v3.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/aarch64-gic-default-v3.args b/tests/qemuxml2argvdata/aarch64-gic-default-v3.args index 04ecd4ce76..6209eff4b0 120000 --- a/tests/qemuxml2argvdata/aarch64-gic-default-v3.args +++ b/tests/qemuxml2argvdata/aarch64-gic-default-v3.args @@ -1 +1 @@ -aarch64-gic-v2.args \ No newline at end of file +aarch64-gic-v3.args \ No newline at end of file diff --git a/tests/qemuxml2xmloutdata/aarch64-gic-default-both.xml b/tests/qemuxml2xmloutdata/aarch64-gic-default-both.xml index ee470fb1fa..bf9d58c385 120000 --- a/tests/qemuxml2xmloutdata/aarch64-gic-default-both.xml +++ b/tests/qemuxml2xmloutdata/aarch64-gic-default-both.xml @@ -1 +1 @@ -../qemuxml2argvdata/aarch64-gic-v2.xml \ No newline at end of file +../qemuxml2argvdata/aarch64-gic-v3.xml \ No newline at end of file diff --git a/tests/qemuxml2xmloutdata/aarch64-gic-default-v3.xml b/tests/qemuxml2xmloutdata/aarch64-gic-default-v3.xml index ee470fb1fa..bf9d58c385 120000 --- a/tests/qemuxml2xmloutdata/aarch64-gic-default-v3.xml +++ b/tests/qemuxml2xmloutdata/aarch64-gic-default-v3.xml @@ -1 +1 @@ -../qemuxml2argvdata/aarch64-gic-v2.xml \ No newline at end of file +../qemuxml2argvdata/aarch64-gic-v3.xml \ No newline at end of file