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 | 49 +++++++++++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 12 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index b0eb3b6..ec59763 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1945,25 +1945,50 @@ qemuDomainDefAddDefaultDevices(virDomainDefPtr def,
* enabled and configure default values related to those features.
*/
static void
-qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def)
+qemuDomainDefEnableDefaultFeatures(virDomainDefPtr def,
+ virQEMUCapsPtr qemuCaps)
{
- 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;
+ do {
+ virGICVersion version;
+
+ if (def->features[VIR_DOMAIN_FEATURE_GIC] != VIR_TRISTATE_SWITCH_ABSENT)
+ break;
+
+ if (def->os.arch != VIR_ARCH_ARMV7L &&
+ def->os.arch != VIR_ARCH_AARCH64)
+ break;
+
+ if (!qemuDomainMachineIsVirt(def))
+ break;
+
+ /* 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 */
+ 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;
+ } while (false);
/* Use the default GIC version if no version was specified */
if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON &&
def->gic_version == VIR_GIC_VERSION_NONE)
def->gic_version = VIR_GIC_VERSION_DEFAULT;
+
+ return;
}
@@ -2056,7 +2081,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
if (qemuCanonicalizeMachine(def, qemuCaps) < 0)
goto cleanup;
- qemuDomainDefEnableDefaultFeatures(def);
+ qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
qemuDomainRecheckInternalPaths(def, cfg, parseFlags);
--
2.5.5