On 11.05.2016 00:42, Cole Robinson wrote:
On 05/10/2016 08:46 AM, Andrea Bolognani wrote:
> 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/conf/domain_capabilities.c | 25 ++++++++++++++++
> src/conf/domain_capabilities.h | 8 +++++
> src/libvirt_private.syms | 1 +
> src/qemu/qemu_domain.c | 66 ++++++++++++++++++++++++++++++++++--------
> 4 files changed, 88 insertions(+), 12 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 93f0a01..d34450f 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -1921,26 +1921,67 @@ qemuDomainDefAddDefaultDevices(virDomainDefPtr def,
> * 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)
> +static int
> +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;
> + virDomainCapsPtr caps = NULL;
> + virDomainCapsFeatureGICPtr gic = NULL;
> + int ret = -1;
> +
> + /* 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->os.arch == VIR_ARCH_ARMV7L ||
> + def->os.arch == VIR_ARCH_AARCH64) &&
> + qemuDomainMachineIsVirt(def) &&
> + def->features[VIR_DOMAIN_FEATURE_GIC] == VIR_TRISTATE_SWITCH_ABSENT) {
> +
> + if (!(caps = virDomainCapsNew(def->emulator,
> + def->os.machine,
> + def->os.arch,
> + def->virtType)))
> + goto cleanup;
> +
Call this domCaps ? 'caps' name is usually used for virCapabilities
> + if (virQEMUCapsFillDomainCaps(caps, qemuCaps, NULL, 0) < 0)
> + goto cleanup;
> +
> + gic = &(caps->gic);
> +
> + /* Pick the best GIC version from those available */
> + if (gic->supported) {
> + virGICVersion version;
> +
> + VIR_DEBUG("Looking for usable GIC version in domain
capabilities");
> + for (version = VIR_GIC_VERSION_LAST - 1;
> + version > VIR_GIC_VERSION_NONE;
> + version--) {
> + if (VIR_DOMAIN_CAPS_ENUM_IS_SET(gic->version, version)) {
> +
> + VIR_DEBUG("Using GIC version %s",
> + virGICVersionTypeToString(version));
> + def->gic_version = version;
> + break;
> + }
> + }
> }
Hmm that's a bit of a new pattern... it seems the only thing you really need
from domcaps is the bit of logic we encode via
virQEMUCapsFillDomainFeatureGICCaps. Maybe break that logic out into a public
function and call it here, rather than spinning up domcaps for a small bit of
info? Or is there more to it?
Agreed. This looks like too heavy hammer for nail this small.
Michal