mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 22:25:25 +00:00
qemu: Automatically choose usable GIC version
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.
This commit is contained in:
parent
58f0152f3b
commit
1a012c9a51
@ -1931,25 +1931,42 @@ 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)
|
||||
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;
|
||||
}
|
||||
break;
|
||||
virGICVersion version;
|
||||
|
||||
default:
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
if (def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ON &&
|
||||
@ -2047,7 +2064,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
|
||||
if (qemuCanonicalizeMachine(def, qemuCaps) < 0)
|
||||
goto cleanup;
|
||||
|
||||
qemuDomainDefEnableDefaultFeatures(def);
|
||||
qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
|
||||
|
||||
qemuDomainRecheckInternalPaths(def, cfg, parseFlags);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user