]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Automatically choose usable GIC version
authorAndrea Bolognani <abologna@redhat.com>
Mon, 9 May 2016 13:38:55 +0000 (15:38 +0200)
committerAndrea Bolognani <abologna@redhat.com>
Wed, 18 May 2016 09:27:50 +0000 (11:27 +0200)
When the <gic/> element in not present in the domain XML, use the
domain capabilities to figure out what GIC version is usable and
choose that one automatically.

This allows guests to be created on hardware that only supports
GIC v3 without having to update virt-manager and similar tools.

Keep using the default GIC version if the <gic/> element has been
added to the domain XML but no version has been specified, as not
to break existing guests.

src/qemu/qemu_domain.c

index 0733872896a6354afebc7cb3b286aa7aafb97004..8222b54683fe8be1325f0a923cd7a1f9eb005a93 100644 (file)
@@ -1931,24 +1931,41 @@ qemuDomainDefAddDefaultDevices(virDomainDefPtr def,
 /**
  * qemuDomainDefEnableDefaultFeatures:
  * @def: domain definition
+ * @qemuCaps: QEMU capabilities
  *
  * Make sure that features that should be enabled by default are actually
  * enabled and configure default values related to those features.
  */
 static void
-qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def)
-{
-    switch (def->os.arch) {
-    case VIR_ARCH_ARMV7L:
-    case VIR_ARCH_AARCH64:
-        if (qemuDomainMachineIsVirt(def)) {
-            /* GIC is always available to ARM virt machines */
-            def->features[VIR_DOMAIN_FEATURE_GIC] = VIR_TRISTATE_SWITCH_ON;
+qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def,
+                                   virQEMUCapsPtr qemuCaps)
+{
+    virGICVersion version;
+
+    /* The virt machine type always uses GIC: if the relevant element
+     * 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 &&
+        (def->os.arch == VIR_ARCH_ARMV7L || def->os.arch == VIR_ARCH_AARCH64) &&
+        qemuDomainMachineIsVirt(def)) {
+
+        VIR_DEBUG("Looking for usable GIC version in domain capabilities");
+        for (version = VIR_GIC_VERSION_LAST - 1;
+             version > VIR_GIC_VERSION_NONE;
+             version--) {
+            if (virQEMUCapsSupportsGICVersion(qemuCaps,
+                                              def->virtType,
+                                              version)) {
+                VIR_DEBUG("Using GIC version %s",
+                          virGICVersionTypeToString(version));
+                def->gic_version = version;
+                break;
+            }
         }
-        break;
 
-    default:
-        break;
+        /* 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 if no version was specified */
@@ -2047,7 +2064,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
     if (qemuCanonicalizeMachine(def, qemuCaps) < 0)
         goto cleanup;
 
-    qemuDomainDefEnableDefaultFeatures(def);
+    qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
 
     qemuDomainRecheckInternalPaths(def, cfg, parseFlags);