[libvirt] [PATCH 08/11] qemu: Fix GIC behavior for the default case

Andrea Bolognani abologna at redhat.com
Tue Feb 6 16:42:57 UTC 2018


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 <abologna at redhat.com>
---
 src/qemu/qemu_domain.c                             | 25 +++++++++++-----------
 .../qemuxml2argvdata/aarch64-gic-default-both.args |  2 +-
 tests/qemuxml2argvdata/aarch64-gic-default-v3.args |  2 +-
 .../aarch64-gic-default-both.xml                   |  2 +-
 .../qemuxml2xmloutdata/aarch64-gic-default-v3.xml  |  2 +-
 5 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 98cba8789..ee720d328 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2838,13 +2838,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;
@@ -2878,17 +2879,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 04ecd4ce7..6209eff4b 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 04ecd4ce7..6209eff4b 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 ee470fb1f..bf9d58c38 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 ee470fb1f..bf9d58c38 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
-- 
2.14.3




More information about the libvir-list mailing list