[libvirt] [PATCH v2 0/5] Automatically choose usable GIC version

Changes from [v1]: * Factor away some of the logic to virQEMUCapsSupportsGICVersion(), as suggested by, and based on a first implementation by, Cole * Factor away the common test suite bits to testutilsqemu.{h,c} to avoid code duplication [v1] https://www.redhat.com/archives/libvir-list/2016-May/msg00637.html Andrea Bolognani (5): qemu: Add virQEMUCapsSupportsGICVersion() qemu: Automatically choose usable GIC version qemu: Add virQEMUCapsSetGICCapabilities() tests: Prepare to have different usable GIC versions tests: Try different usable GIC versions src/qemu/qemu_capabilities.c | 91 ++++++++++-- src/qemu/qemu_capabilities.h | 9 ++ src/qemu/qemu_domain.c | 49 +++++-- .../qemuxml2argv-aarch64-gic-none-both.args | 1 + .../qemuxml2argv-aarch64-gic-none-both.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v2.args | 1 + .../qemuxml2argv-aarch64-gic-none-v2.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v3.args | 1 + .../qemuxml2argv-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2argvtest.c | 125 +++++++++++++---- .../qemuxml2xmlout-aarch64-gic-none-both.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v2.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2xmltest.c | 155 ++++++++++++--------- tests/testutilsqemu.c | 36 +++++ tests/testutilsqemu.h | 10 ++ 16 files changed, 361 insertions(+), 123 deletions(-) create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml -- 2.5.5

This utility function extracts some of the logic from virQEMUCapsFillDomainFeatureGICCaps() so that it can be used in a different context. --- src/qemu/qemu_capabilities.c | 62 ++++++++++++++++++++++++++++++++++++-------- src/qemu/qemu_capabilities.h | 4 +++ 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index fcfd1cd..9055bf9 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4258,6 +4258,49 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps, /** + * virQEMUCapsSupportsGICVersion: + * @qemuCaps: QEMU capabilities + * @virtType: domain type + * @version: GIC version + * + * Checks the QEMU binary with capabilities @qemuCaps supports a specific + * GIC version for a domain of type @virtType. + * + * Returns: true if the binary supports the requested GIC version, false + * otherwise + */ +bool +virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps, + virDomainVirtType virtType, + virGICVersion version) +{ + size_t i; + bool ret = false; + + for (i = 0; i < qemuCaps->ngicCapabilities; i++) { + virGICCapabilityPtr cap = &(qemuCaps->gicCapabilities[i]); + + if (cap->version != version) + continue; + + if (virtType == VIR_DOMAIN_VIRT_KVM && + cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL) { + ret = true; + break; + } + + if (virtType == VIR_DOMAIN_VIRT_QEMU && + cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED) { + ret = true; + break; + } + } + + return ret; +} + + +/** * virQEMUCapsFillDomainFeatureGICCaps: * @qemuCaps: QEMU capabilities * @domCaps: domain capabilities @@ -4281,7 +4324,7 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps, virDomainCapsPtr domCaps) { virDomainCapsFeatureGICPtr gic = &domCaps->gic; - size_t i; + virGICVersion version; if (domCaps->arch != VIR_ARCH_ARMV7L && domCaps->arch != VIR_ARCH_AARCH64) @@ -4291,20 +4334,17 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps, !STRPREFIX(domCaps->machine, "virt-")) return 0; - for (i = 0; i < qemuCaps->ngicCapabilities; i++) { - virGICCapabilityPtr cap = &qemuCaps->gicCapabilities[i]; - - if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM && - !(cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL)) - continue; - - if (domCaps->virttype == VIR_DOMAIN_VIRT_QEMU && - !(cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED)) + for (version = VIR_GIC_VERSION_LAST - 1; + version > VIR_GIC_VERSION_NONE; + version--) { + if (!virQEMUCapsSupportsGICVersion(qemuCaps, + domCaps->virttype, + version)) continue; gic->supported = true; VIR_DOMAIN_CAPS_ENUM_SET(gic->version, - cap->version); + version); } return 0; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index e7d0a60..fef78b7 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -462,6 +462,10 @@ bool virQEMUCapsSupportsChardev(const virDomainDef *def, virQEMUCapsPtr qemuCaps, virDomainChrDefPtr chr); +bool virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps, + virDomainVirtType virtType, + virGICVersion version); + bool virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps, const char *canonical_machine); -- 2.5.5

On 05/16/2016 06:00 PM, Andrea Bolognani wrote:
This utility function extracts some of the logic from virQEMUCapsFillDomainFeatureGICCaps() so that it can be used in a different context. --- src/qemu/qemu_capabilities.c | 62 ++++++++++++++++++++++++++++++++++++-------- src/qemu/qemu_capabilities.h | 4 +++ 2 files changed, 55 insertions(+), 11 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index fcfd1cd..9055bf9 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -4258,6 +4258,49 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
/** + * virQEMUCapsSupportsGICVersion: + * @qemuCaps: QEMU capabilities + * @virtType: domain type + * @version: GIC version + * + * Checks the QEMU binary with capabilities @qemuCaps supports a specific + * GIC version for a domain of type @virtType. + * + * Returns: true if the binary supports the requested GIC version, false + * otherwise + */ +bool +virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps, + virDomainVirtType virtType, + virGICVersion version) +{ + size_t i; + bool ret = false;
remove
+ + for (i = 0; i < qemuCaps->ngicCapabilities; i++) { + virGICCapabilityPtr cap = &(qemuCaps->gicCapabilities[i]); + + if (cap->version != version) + continue; + + if (virtType == VIR_DOMAIN_VIRT_KVM && + cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL) { + ret = true;
Just return true (no need for {} either)
+ break; + } + + if (virtType == VIR_DOMAIN_VIRT_QEMU && + cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED) { + ret = true;
Same here
+ break; + } + } + + return ret;
return false ACK w/ those adjustments John
+} + + +/** * virQEMUCapsFillDomainFeatureGICCaps: * @qemuCaps: QEMU capabilities * @domCaps: domain capabilities @@ -4281,7 +4324,7 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps, virDomainCapsPtr domCaps) { virDomainCapsFeatureGICPtr gic = &domCaps->gic; - size_t i; + virGICVersion version;
if (domCaps->arch != VIR_ARCH_ARMV7L && domCaps->arch != VIR_ARCH_AARCH64) @@ -4291,20 +4334,17 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps, !STRPREFIX(domCaps->machine, "virt-")) return 0;
- for (i = 0; i < qemuCaps->ngicCapabilities; i++) { - virGICCapabilityPtr cap = &qemuCaps->gicCapabilities[i]; - - if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM && - !(cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL)) - continue; - - if (domCaps->virttype == VIR_DOMAIN_VIRT_QEMU && - !(cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED)) + for (version = VIR_GIC_VERSION_LAST - 1; + version > VIR_GIC_VERSION_NONE; + version--) { + if (!virQEMUCapsSupportsGICVersion(qemuCaps, + domCaps->virttype, + version)) continue;
gic->supported = true; VIR_DOMAIN_CAPS_ENUM_SET(gic->version, - cap->version); + version); }
return 0; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index e7d0a60..fef78b7 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -462,6 +462,10 @@ bool virQEMUCapsSupportsChardev(const virDomainDef *def, virQEMUCapsPtr qemuCaps, virDomainChrDefPtr chr);
+bool virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps, + virDomainVirtType virtType, + virGICVersion version); + bool virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps, const char *canonical_machine);

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

On 05/16/2016 06:00 PM, 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/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,
Document @qemuCaps
* 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 {
Not a fan... Isn't what you're doing the same as: 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)) {
+ 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;
removing these checks
+ + /* 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);
Removing the " 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;
Unnecessary for void function can be removed anyway ACK with the adjustments John
}
@@ -2056,7 +2081,7 @@ qemuDomainDefPostParse(virDomainDefPtr def, if (qemuCanonicalizeMachine(def, qemuCaps) < 0) goto cleanup;
- qemuDomainDefEnableDefaultFeatures(def); + qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
qemuDomainRecheckInternalPaths(def, cfg, parseFlags);

On Tue, 2016-05-17 at 16:10 -0400, John Ferlan wrote:
* 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 {
Not a fan... Isn't what you're doing the same as:
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)) {
The idea was to closely mirror virQEMUCapsFillDomainFeatureGICCaps(), but yeah, it's functionally identical to your version. I'm not exceedingly happy with cramming tons of conditions in the same if() - I think it makes for less readable code overall - but it's a well-established pattern used all over the place in libvirt, so let's stick with it. -- Andrea Bolognani Software Engineer - Virtualization Team

For use in the test suite. --- src/qemu/qemu_capabilities.c | 29 +++++++++++++++++++++++++---- src/qemu/qemu_capabilities.h | 5 +++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 9055bf9..891cab1 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2388,6 +2388,30 @@ int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps, } +/** + * virQEMUCapsSetGICCapabilities: + * @qemuCaps: QEMU capabilities + * @capabilities: GIC capabilities + * @ncapabilities: number of GIC capabilities + * + * Set the GIC capabilities for @qemuCaps. + * + * The ownership of @capabilities is taken away from the caller, ie. this + * function will not make a copy of @capabilities, so releasing that memory + * after it's been called is a bug. + */ +void +virQEMUCapsSetGICCapabilities(virQEMUCapsPtr qemuCaps, + virGICCapability *capabilities, + size_t ncapabilities) +{ + VIR_FREE(qemuCaps->gicCapabilities); + + qemuCaps->gicCapabilities = capabilities; + qemuCaps->ngicCapabilities = ncapabilities; +} + + static int virQEMUCapsProbeQMPCommands(virQEMUCapsPtr qemuCaps, qemuMonitorPtr mon) @@ -2739,10 +2763,7 @@ virQEMUCapsProbeQMPGICCapabilities(virQEMUCapsPtr qemuCaps, if ((ncaps = qemuMonitorGetGICCapabilities(mon, &caps)) < 0) return -1; - VIR_FREE(qemuCaps->gicCapabilities); - - qemuCaps->gicCapabilities = caps; - qemuCaps->ngicCapabilities = ncaps; + virQEMUCapsSetGICCapabilities(qemuCaps, caps, ncaps); return 0; } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index fef78b7..16fd2de 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -426,6 +426,11 @@ bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps); void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps, const char *machineType); +/* Only for use by test suite */ +void virQEMUCapsSetGICCapabilities(virQEMUCapsPtr qemuCaps, + virGICCapability *capabilities, + size_t ncapabilities); + virQEMUCapsCachePtr virQEMUCapsCacheNew(const char *libDir, const char *cacheDir, uid_t uid, gid_t gid); -- 2.5.5

On 05/16/2016 06:00 PM, Andrea Bolognani wrote:
For use in the test suite. --- src/qemu/qemu_capabilities.c | 29 +++++++++++++++++++++++++---- src/qemu/qemu_capabilities.h | 5 +++++ 2 files changed, 30 insertions(+), 4 deletions(-)
ACK John

Now that we choose the GIC version based on hardware features when no <gic/> element has been provided, we need a way to fake the GIC capabilities of the host. Update the qemuxml2argv and qemuxml2xml tests to allow this. --- tests/qemuxml2argvtest.c | 49 +++++++++++++----- tests/qemuxml2xmltest.c | 130 ++++++++++++++++++++++++----------------------- tests/testutilsqemu.c | 36 +++++++++++++ tests/testutilsqemu.h | 10 ++++ 4 files changed, 148 insertions(+), 77 deletions(-) diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index d1cfbec..6b804b8 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -452,6 +452,28 @@ testAddCPUModels(virQEMUCapsPtr caps, bool skipLegacy) static int +testPrepareExtraFlags(struct testInfo *info, + bool skipLegacyCPUs, + int gic) +{ + int ret = -1; + + if (!(info->extraFlags = virQEMUCapsNew())) + goto out; + + if (testAddCPUModels(info->extraFlags, skipLegacyCPUs) < 0) + goto out; + + if (testQemuCapsSetGIC(info->extraFlags, gic) < 0) + goto out; + + ret = 0; + + out: + return ret; +} + +static int mymain(void) { int ret = 0; @@ -501,14 +523,12 @@ mymain(void) return EXIT_FAILURE; # define DO_TEST_FULL(name, migrateFrom, migrateFd, flags, \ - parseFlags, ...) \ + parseFlags, gic, ...) \ do { \ static struct testInfo info = { \ name, NULL, migrateFrom, migrateFd, (flags), parseFlags \ }; \ - if (!(info.extraFlags = virQEMUCapsNew())) \ - return EXIT_FAILURE; \ - if (testAddCPUModels(info.extraFlags, skipLegacyCPUs) < 0) \ + if (testPrepareExtraFlags(&info, skipLegacyCPUs, gic) < 0) \ return EXIT_FAILURE; \ virQEMUCapsSetList(info.extraFlags, __VA_ARGS__, QEMU_CAPS_LAST);\ if (virtTestRun("QEMU XML-2-ARGV " name, \ @@ -518,23 +538,24 @@ mymain(void) } while (0) # define DO_TEST(name, ...) \ - DO_TEST_FULL(name, NULL, -1, 0, 0, __VA_ARGS__) + DO_TEST_FULL(name, NULL, -1, 0, 0, GIC_NONE, __VA_ARGS__) # define DO_TEST_FAILURE(name, ...) \ - DO_TEST_FULL(name, NULL, -1, FLAG_EXPECT_FAILURE, 0, __VA_ARGS__) + DO_TEST_FULL(name, NULL, -1, FLAG_EXPECT_FAILURE, \ + 0, GIC_NONE, __VA_ARGS__) # define DO_TEST_PARSE_ERROR(name, ...) \ DO_TEST_FULL(name, NULL, -1, \ FLAG_EXPECT_PARSE_ERROR | FLAG_EXPECT_FAILURE, \ - 0, __VA_ARGS__) + 0, GIC_NONE, __VA_ARGS__) # define DO_TEST_PARSE_FLAGS_ERROR(name, parseFlags, ...) \ DO_TEST_FULL(name, NULL, -1, \ FLAG_EXPECT_PARSE_ERROR | FLAG_EXPECT_FAILURE, \ - parseFlags, __VA_ARGS__) + parseFlags, GIC_NONE, __VA_ARGS__) # define DO_TEST_LINUX(name, ...) \ - DO_TEST_LINUX_FULL(name, NULL, -1, 0, 0, __VA_ARGS__) + DO_TEST_LINUX_FULL(name, NULL, -1, 0, 0, GIC_NONE, __VA_ARGS__) # ifdef __linux__ /* This is a macro that invokes test only on Linux. It's @@ -1236,12 +1257,12 @@ mymain(void) QEMU_CAPS_PCIDEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_PCI_ROMBAR); - DO_TEST_FULL("restore-v2", "exec:cat", 7, 0, 0, NONE); - DO_TEST_FULL("restore-v2-fd", "stdio", 7, 0, 0, NONE); - DO_TEST_FULL("restore-v2-fd", "fd:7", 7, 0, 0, NONE); - DO_TEST_FULL("migrate", "tcp:10.0.0.1:5000", -1, 0, 0, NONE); + DO_TEST_FULL("restore-v2", "exec:cat", 7, 0, 0, GIC_NONE, NONE); + DO_TEST_FULL("restore-v2-fd", "stdio", 7, 0, 0, GIC_NONE, NONE); + DO_TEST_FULL("restore-v2-fd", "fd:7", 7, 0, 0, GIC_NONE, NONE); + DO_TEST_FULL("migrate", "tcp:10.0.0.1:5000", -1, 0, 0, GIC_NONE, NONE); - DO_TEST_LINUX_FULL("migrate-numa-unaligned", "stdio", 7, 0, 0, + DO_TEST_LINUX_FULL("migrate-numa-unaligned", "stdio", 7, 0, 0, GIC_NONE, QEMU_CAPS_NUMA, QEMU_CAPS_OBJECT_MEMORY_RAM); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 5a43fa9..9d2109b 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -201,7 +201,8 @@ testInfoFree(struct testInfo *info) static int testInfoSet(struct testInfo *info, const char *name, - int when) + int when, + int gic) { if (!(info->qemuCaps = virQEMUCapsNew())) goto error; @@ -210,6 +211,9 @@ testInfoSet(struct testInfo *info, QEMU_CAPS_DEVICE, QEMU_CAPS_LAST); + if (testQemuCapsSetGIC(info->qemuCaps, gic) < 0) + goto error; + if (qemuTestCapsCacheInsert(driver.qemuCapsCache, name, info->qemuCaps) < 0) goto error; @@ -271,9 +275,9 @@ mymain(void) /* TODO: test with format probing disabled too */ driver.config->allowDiskFormatProbing = true; -# define DO_TEST_FULL(name, when, ...) \ +# define DO_TEST_FULL(name, when, gic, ...) \ do { \ - if (testInfoSet(&info, name, when) < 0) { \ + if (testInfoSet(&info, name, when, gic) < 0) { \ VIR_TEST_DEBUG("Failed to generate test data for '%s'", name); \ return -1; \ } \ @@ -300,7 +304,7 @@ mymain(void) # define NONE QEMU_CAPS_LAST # define DO_TEST(name) \ - DO_TEST_FULL(name, WHEN_BOTH, NONE) + DO_TEST_FULL(name, WHEN_BOTH, GIC_NONE, NONE) @@ -398,36 +402,36 @@ mymain(void) DO_TEST("disk-drive-network-rbd-ipv6"); DO_TEST("disk-drive-network-rbd-ceph-env"); DO_TEST("disk-drive-network-sheepdog"); - DO_TEST_FULL("disk-scsi-device", WHEN_ACTIVE, + DO_TEST_FULL("disk-scsi-device", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_LSI); DO_TEST("disk-scsi-vscsi"); - DO_TEST_FULL("disk-scsi-virtio-scsi", WHEN_ACTIVE, + DO_TEST_FULL("disk-scsi-virtio-scsi", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST_FULL("disk-virtio-scsi-num_queues", WHEN_ACTIVE, + DO_TEST_FULL("disk-virtio-scsi-num_queues", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST_FULL("disk-virtio-scsi-cmd_per_lun", WHEN_ACTIVE, + DO_TEST_FULL("disk-virtio-scsi-cmd_per_lun", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST_FULL("disk-virtio-scsi-max_sectors", WHEN_ACTIVE, + DO_TEST_FULL("disk-virtio-scsi-max_sectors", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST_FULL("disk-virtio-scsi-ioeventfd", WHEN_ACTIVE, + DO_TEST_FULL("disk-virtio-scsi-ioeventfd", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST_FULL("disk-scsi-megasas", WHEN_ACTIVE, + DO_TEST_FULL("disk-scsi-megasas", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_MEGASAS); - DO_TEST_FULL("disk-scsi-mptsas1068", WHEN_ACTIVE, + DO_TEST_FULL("disk-scsi-mptsas1068", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_MPTSAS1068, QEMU_CAPS_SCSI_DISK_WWN); DO_TEST("disk-mirror-old"); - DO_TEST_FULL("disk-mirror", WHEN_ACTIVE, NONE); - DO_TEST_FULL("disk-mirror", WHEN_INACTIVE, NONE); - DO_TEST_FULL("disk-active-commit", WHEN_ACTIVE, NONE); + DO_TEST_FULL("disk-mirror", WHEN_ACTIVE, GIC_NONE, NONE); + DO_TEST_FULL("disk-mirror", WHEN_INACTIVE, GIC_NONE, NONE); + DO_TEST_FULL("disk-active-commit", WHEN_ACTIVE, GIC_NONE, NONE); DO_TEST("graphics-listen-network"); DO_TEST("graphics-vnc"); DO_TEST("graphics-vnc-websocket"); @@ -501,7 +505,7 @@ mymain(void) DO_TEST("cputune-iothreadsched"); DO_TEST("cputune-iothreadsched-zeropriority"); DO_TEST("cputune-numatune"); - DO_TEST_FULL("vcpu-placement-static", WHEN_ACTIVE, + DO_TEST_FULL("vcpu-placement-static", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE); DO_TEST("smp"); @@ -510,12 +514,12 @@ mymain(void) DO_TEST("iothreads-ids-partial"); DO_TEST("cputune-iothreads"); DO_TEST("iothreads-disk"); - DO_TEST_FULL("iothreads-disk-virtio-ccw", WHEN_ACTIVE, + DO_TEST_FULL("iothreads-disk-virtio-ccw", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390); - DO_TEST_FULL("iothreads-virtio-scsi-pci", WHEN_ACTIVE, + DO_TEST_FULL("iothreads-virtio-scsi-pci", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST_FULL("iothreads-virtio-scsi-ccw", WHEN_ACTIVE, + DO_TEST_FULL("iothreads-virtio-scsi-ccw", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390); @@ -532,24 +536,24 @@ mymain(void) DO_TEST("blkdeviotune"); DO_TEST("controller-usb-order"); - DO_TEST_FULL("seclabel-dynamic-baselabel", WHEN_INACTIVE, NONE); - DO_TEST_FULL("seclabel-dynamic-override", WHEN_INACTIVE, NONE); - DO_TEST_FULL("seclabel-dynamic-labelskip", WHEN_INACTIVE, NONE); - DO_TEST_FULL("seclabel-dynamic-relabel", WHEN_INACTIVE, NONE); + DO_TEST_FULL("seclabel-dynamic-baselabel", WHEN_INACTIVE, GIC_NONE, NONE); + DO_TEST_FULL("seclabel-dynamic-override", WHEN_INACTIVE, GIC_NONE, NONE); + DO_TEST_FULL("seclabel-dynamic-labelskip", WHEN_INACTIVE, GIC_NONE, NONE); + DO_TEST_FULL("seclabel-dynamic-relabel", WHEN_INACTIVE, GIC_NONE, NONE); DO_TEST("seclabel-static"); - DO_TEST_FULL("seclabel-static-labelskip", WHEN_ACTIVE, NONE); + DO_TEST_FULL("seclabel-static-labelskip", WHEN_ACTIVE, GIC_NONE, NONE); DO_TEST("seclabel-none"); DO_TEST("seclabel-dac-none"); DO_TEST("seclabel-dynamic-none"); DO_TEST("seclabel-device-multiple"); - DO_TEST_FULL("seclabel-dynamic-none-relabel", WHEN_INACTIVE, NONE); + DO_TEST_FULL("seclabel-dynamic-none-relabel", WHEN_INACTIVE, GIC_NONE, NONE); DO_TEST("numad-static-vcpu-no-numatune"); - DO_TEST_FULL("disk-scsi-lun-passthrough-sgio", WHEN_ACTIVE, + DO_TEST_FULL("disk-scsi-lun-passthrough-sgio", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_DISK_WWN); - DO_TEST_FULL("disk-scsi-disk-vpd", WHEN_ACTIVE, + DO_TEST_FULL("disk-scsi-disk-vpd", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_CD, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_DISK_WWN); @@ -569,7 +573,7 @@ mymain(void) DO_TEST("balloon-device-period"); DO_TEST("channel-virtio-auto"); DO_TEST("console-compat-auto"); - DO_TEST_FULL("disk-scsi-device-auto", WHEN_ACTIVE, + DO_TEST_FULL("disk-scsi-device-auto", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_LSI); DO_TEST("console-virtio"); @@ -586,37 +590,37 @@ mymain(void) DO_TEST("metadata"); DO_TEST("metadata-duplicate"); - DO_TEST_FULL("pci-bridge", WHEN_ACTIVE, + DO_TEST_FULL("pci-bridge", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE); - DO_TEST_FULL("pci-bridge-many-disks", WHEN_ACTIVE, + DO_TEST_FULL("pci-bridge-many-disks", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE); - DO_TEST_FULL("pci-autoadd-addr", WHEN_ACTIVE, + DO_TEST_FULL("pci-autoadd-addr", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE); - DO_TEST_FULL("pci-autoadd-idx", WHEN_ACTIVE, + DO_TEST_FULL("pci-autoadd-idx", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE); - DO_TEST_FULL("q35", WHEN_ACTIVE, + DO_TEST_FULL("q35", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("q35-usb2", WHEN_ACTIVE, + DO_TEST_FULL("q35-usb2", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("q35-usb2-multi", WHEN_ACTIVE, + DO_TEST_FULL("q35-usb2-multi", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("q35-usb2-reorder", WHEN_ACTIVE, + DO_TEST_FULL("q35-usb2-reorder", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_ICH9_AHCI, @@ -624,38 +628,38 @@ mymain(void) QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("pcie-root", WHEN_ACTIVE, + DO_TEST_FULL("pcie-root", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_DEVICE_IOH3420, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("pcie-root-port", WHEN_ACTIVE, + DO_TEST_FULL("pcie-root-port", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_DEVICE_IOH3420, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("pcie-switch-upstream-port", WHEN_ACTIVE, + DO_TEST_FULL("pcie-switch-upstream-port", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_DEVICE_IOH3420, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("pcie-switch-downstream-port", WHEN_ACTIVE, + DO_TEST_FULL("pcie-switch-downstream-port", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_DEVICE_IOH3420, QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL); - DO_TEST_FULL("pci-expander-bus", WHEN_ACTIVE, + DO_TEST_FULL("pci-expander-bus", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_PXB); - DO_TEST_FULL("pcie-expander-bus", WHEN_ACTIVE, + DO_TEST_FULL("pcie-expander-bus", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_DEVICE_IOH3420, @@ -664,59 +668,59 @@ mymain(void) QEMU_CAPS_DEVICE_PXB_PCIE); - DO_TEST_FULL("hostdev-scsi-lsi", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-lsi", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-virtio-scsi", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-virtio-scsi", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-readonly", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-readonly", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-shareable", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-shareable", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-sgio", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-sgio", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-rawio", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-rawio", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-autogen-address", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-autogen-address", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-large-unit", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-large-unit", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-lsi-iscsi", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-lsi-iscsi", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-lsi-iscsi-auth", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-lsi-iscsi-auth", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-virtio-iscsi", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-virtio-iscsi", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("hostdev-scsi-virtio-iscsi-auth", WHEN_ACTIVE, + DO_TEST_FULL("hostdev-scsi-virtio-iscsi-auth", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_SCSI, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_DEVICE_SCSI_GENERIC); - DO_TEST_FULL("s390-defaultconsole", WHEN_ACTIVE, + DO_TEST_FULL("s390-defaultconsole", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390); - DO_TEST_FULL("s390-panic", WHEN_BOTH, + DO_TEST_FULL("s390-panic", WHEN_BOTH, GIC_NONE, QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390); - DO_TEST_FULL("s390-panic-missing", WHEN_BOTH, + DO_TEST_FULL("s390-panic-missing", WHEN_BOTH, GIC_NONE, QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390); - DO_TEST_FULL("s390-panic-no-address", WHEN_BOTH, + DO_TEST_FULL("s390-panic-no-address", WHEN_BOTH, GIC_NONE, QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390); DO_TEST("pcihole64"); DO_TEST("pcihole64-gib"); DO_TEST("pcihole64-none"); - DO_TEST_FULL("pcihole64-q35", WHEN_ACTIVE, + DO_TEST_FULL("pcihole64-q35", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_ICH9_AHCI, @@ -754,17 +758,17 @@ mymain(void) DO_TEST("smbios"); DO_TEST("smbios-multiple-type2"); - DO_TEST_FULL("aarch64-aavmf-virtio-mmio", WHEN_ACTIVE, + DO_TEST_FULL("aarch64-aavmf-virtio-mmio", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, QEMU_CAPS_DEVICE_VIRTIO_MMIO, QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM); - DO_TEST_FULL("aarch64-virtio-pci-default", WHEN_ACTIVE, + DO_TEST_FULL("aarch64-virtio-pci-default", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, QEMU_CAPS_DEVICE_VIRTIO_MMIO, QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM, QEMU_CAPS_OBJECT_GPEX, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST_FULL("aarch64-virtio-pci-manual-addresses", WHEN_ACTIVE, + DO_TEST_FULL("aarch64-virtio-pci-manual-addresses", WHEN_ACTIVE, GIC_NONE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DTB, QEMU_CAPS_DEVICE_VIRTIO_MMIO, QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM, @@ -790,7 +794,7 @@ mymain(void) cfg = virQEMUDriverGetConfig(&driver); cfg->vncAutoUnixSocket = true; - DO_TEST_FULL("graphics-vnc-autosocket", WHEN_INACTIVE, NONE); + DO_TEST_FULL("graphics-vnc-autosocket", WHEN_INACTIVE, GIC_NONE, NONE); cfg->vncAutoUnixSocket = false; virObjectUnref(cfg); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 8f7f52b..1cf72a9 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -556,4 +556,40 @@ int qemuTestDriverInit(virQEMUDriver *driver) return -1; } +int +testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps, + int gic) +{ + virGICCapability *gicCapabilities = NULL; + size_t ngicCapabilities = 0; + int ret = -1; + + if (VIR_ALLOC_N(gicCapabilities, 2) < 0) + goto out; + +# define IMPL_BOTH \ + VIR_GIC_IMPLEMENTATION_KERNEL|VIR_GIC_IMPLEMENTATION_EMULATED + + if (gic & GIC_V2) { + gicCapabilities[ngicCapabilities].version = VIR_GIC_VERSION_2; + gicCapabilities[ngicCapabilities].implementation = IMPL_BOTH; + ngicCapabilities++; + } + if (gic & GIC_V3) { + gicCapabilities[ngicCapabilities].version = VIR_GIC_VERSION_3; + gicCapabilities[ngicCapabilities].implementation = IMPL_BOTH; + ngicCapabilities++; + } + +# undef IMPL_BOTH + + virQEMUCapsSetGICCapabilities(qemuCaps, + gicCapabilities, ngicCapabilities); + + ret = 0; + + out: + return ret; +} + #endif diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h index f5a8056..f2b71e9 100644 --- a/tests/testutilsqemu.h +++ b/tests/testutilsqemu.h @@ -5,6 +5,13 @@ # include "qemu/qemu_capabilities.h" # include "qemu/qemu_conf.h" +enum { + GIC_NONE = 0, + GIC_V2, + GIC_V3, + GIC_BOTH, +}; + virCapsPtr testQemuCapsInit(void); virDomainXMLOptionPtr testQemuXMLConfInit(void); @@ -20,6 +27,9 @@ void qemuTestDriverFree(virQEMUDriver *driver); int qemuTestCapsCacheInsert(virQEMUCapsCachePtr cache, const char *binary, virQEMUCapsPtr caps); +int testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps, + int gic); + /* This variable is actually defined in src/qemu/qemu_capabilities.c */ extern const char *qemuTestCapsName; #endif -- 2.5.5

On 05/16/2016 06:00 PM, Andrea Bolognani wrote:
Now that we choose the GIC version based on hardware features when no <gic/> element has been provided, we need a way to fake the GIC capabilities of the host.
Update the qemuxml2argv and qemuxml2xml tests to allow this. --- tests/qemuxml2argvtest.c | 49 +++++++++++++----- tests/qemuxml2xmltest.c | 130 ++++++++++++++++++++++++----------------------- tests/testutilsqemu.c | 36 +++++++++++++ tests/testutilsqemu.h | 10 ++++ 4 files changed, 148 insertions(+), 77 deletions(-)
ACK John

The only case where the hardware capabilities influence the result is when no <gic/> element was provided. The test programs now ensure both that the correct GIC version is picked in that case, and that hardware capabilities are not taken into account when the user has already picked a GIC version. --- .../qemuxml2argv-aarch64-gic-none-both.args | 1 + .../qemuxml2argv-aarch64-gic-none-both.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v2.args | 1 + .../qemuxml2argv-aarch64-gic-none-v2.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v3.args | 1 + .../qemuxml2argv-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2argvtest.c | 76 ++++++++++++++++++---- .../qemuxml2xmlout-aarch64-gic-none-both.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v2.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2xmltest.c | 25 +++++-- 11 files changed, 91 insertions(+), 19 deletions(-) create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args new file mode 120000 index 0000000..5b20f61 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-v3.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml new file mode 120000 index 0000000..d859f53 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-none.xml \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args new file mode 120000 index 0000000..3234039 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-v2.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml new file mode 120000 index 0000000..d859f53 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-none.xml \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args new file mode 120000 index 0000000..5b20f61 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-v3.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml new file mode 120000 index 0000000..88c660c --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-none-v2.xml \ No newline at end of file diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 6b804b8..734861d 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -540,6 +540,9 @@ mymain(void) # define DO_TEST(name, ...) \ DO_TEST_FULL(name, NULL, -1, 0, 0, GIC_NONE, __VA_ARGS__) +# define DO_TEST_GIC(name, gic, ...) \ + DO_TEST_FULL(name, NULL, -1, 0, 0, gic, __VA_ARGS__) + # define DO_TEST_FAILURE(name, ...) \ DO_TEST_FULL(name, NULL, -1, FLAG_EXPECT_FAILURE, \ 0, GIC_NONE, __VA_ARGS__) @@ -1740,38 +1743,83 @@ mymain(void) DO_TEST("aarch64-cpu-passthrough", QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DEVICE_VIRTIO_MMIO, QEMU_CAPS_CPU_HOST, QEMU_CAPS_KVM); - DO_TEST("aarch64-gic-none", + DO_TEST_GIC("aarch64-gic-none", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); + DO_TEST_GIC("aarch64-gic-none", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST("aarch64-gic-none", - QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-default", + DO_TEST_GIC("aarch64-gic-none-v2", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-none-v3", GIC_V3, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST("aarch64-gic-default", + DO_TEST_GIC("aarch64-gic-none-both", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-default", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-v2", + DO_TEST_GIC("aarch64-gic-default", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-default", GIC_V2, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST("aarch64-gic-v2", + DO_TEST_GIC("aarch64-gic-default", GIC_V3, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-default", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v2", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-v3", + DO_TEST_GIC("aarch64-gic-v2", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v2", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v2", GIC_V3, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-v3", + DO_TEST_GIC("aarch64-gic-v2", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_FAILURE("aarch64-gic-v3", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-host", + DO_TEST_GIC("aarch64-gic-v3", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v3", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v3", GIC_V3, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v3", GIC_BOTH, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-host", + DO_TEST_FAILURE("aarch64-gic-host", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST_PARSE_ERROR("aarch64-gic-invalid", + DO_TEST_GIC("aarch64-gic-host", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-host", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-host", GIC_V3, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-host", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_PARSE_ERROR("aarch64-gic-invalid", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-not-virt", + DO_TEST_FAILURE("aarch64-gic-not-virt", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-not-arm", + DO_TEST_FAILURE("aarch64-gic-not-arm", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml new file mode 120000 index 0000000..f586fa1 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/qemuxml2argv-aarch64-gic-v3.xml \ No newline at end of file diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml new file mode 120000 index 0000000..80a01c2 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/qemuxml2argv-aarch64-gic-v2.xml \ No newline at end of file diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml new file mode 120000 index 0000000..f586fa1 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/qemuxml2argv-aarch64-gic-v3.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 9d2109b..404cd10 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -775,11 +775,26 @@ mymain(void) QEMU_CAPS_OBJECT_GPEX, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_VIRTIO_SCSI); - DO_TEST("aarch64-gic-none"); - DO_TEST("aarch64-gic-default"); - DO_TEST("aarch64-gic-v2"); - DO_TEST("aarch64-gic-v3"); - DO_TEST("aarch64-gic-host"); + DO_TEST_FULL("aarch64-gic-none", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-none-v2", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-none-v3", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-none-both", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_BOTH, NONE); DO_TEST("memory-hotplug"); DO_TEST("memory-hotplug-nonuma"); -- 2.5.5

On 05/16/2016 06:00 PM, Andrea Bolognani wrote:
The only case where the hardware capabilities influence the result is when no <gic/> element was provided.
The test programs now ensure both that the correct GIC version is picked in that case, and that hardware capabilities are not taken into account when the user has already picked a GIC version. --- .../qemuxml2argv-aarch64-gic-none-both.args | 1 + .../qemuxml2argv-aarch64-gic-none-both.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v2.args | 1 + .../qemuxml2argv-aarch64-gic-none-v2.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v3.args | 1 + .../qemuxml2argv-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2argvtest.c | 76 ++++++++++++++++++---- .../qemuxml2xmlout-aarch64-gic-none-both.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v2.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2xmltest.c | 25 +++++-- 11 files changed, 91 insertions(+), 19 deletions(-) create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml
This failed to apply - seemingly because there's QEMU_CAPS_CPU_HOST in here that has changed since you posted to X_QEMU_CAPS_CPU_HOST But if I very carefully massage it, I was able to run the test - nothing like testing the crap out of things! So ACK with the I hope obvious adjustment to remove QEMU_CAPS_CPU_HOST John
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args new file mode 120000 index 0000000..5b20f61 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-v3.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml new file mode 120000 index 0000000..d859f53 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-none.xml \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args new file mode 120000 index 0000000..3234039 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-v2.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml new file mode 120000 index 0000000..d859f53 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-none.xml \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args new file mode 120000 index 0000000..5b20f61 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-v3.args \ No newline at end of file diff --git a/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml new file mode 120000 index 0000000..88c660c --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml @@ -0,0 +1 @@ +qemuxml2argv-aarch64-gic-none-v2.xml \ No newline at end of file diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 6b804b8..734861d 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -540,6 +540,9 @@ mymain(void) # define DO_TEST(name, ...) \ DO_TEST_FULL(name, NULL, -1, 0, 0, GIC_NONE, __VA_ARGS__)
+# define DO_TEST_GIC(name, gic, ...) \ + DO_TEST_FULL(name, NULL, -1, 0, 0, gic, __VA_ARGS__) + # define DO_TEST_FAILURE(name, ...) \ DO_TEST_FULL(name, NULL, -1, FLAG_EXPECT_FAILURE, \ 0, GIC_NONE, __VA_ARGS__) @@ -1740,38 +1743,83 @@ mymain(void) DO_TEST("aarch64-cpu-passthrough", QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_DEVICE_VIRTIO_MMIO, QEMU_CAPS_CPU_HOST, QEMU_CAPS_KVM); - DO_TEST("aarch64-gic-none", + DO_TEST_GIC("aarch64-gic-none", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); + DO_TEST_GIC("aarch64-gic-none", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST("aarch64-gic-none", - QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-default", + DO_TEST_GIC("aarch64-gic-none-v2", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-none-v3", GIC_V3, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST("aarch64-gic-default", + DO_TEST_GIC("aarch64-gic-none-both", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-default", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-v2", + DO_TEST_GIC("aarch64-gic-default", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-default", GIC_V2, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST("aarch64-gic-v2", + DO_TEST_GIC("aarch64-gic-default", GIC_V3, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-default", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v2", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-v3", + DO_TEST_GIC("aarch64-gic-v2", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v2", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v2", GIC_V3, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-v3", + DO_TEST_GIC("aarch64-gic-v2", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_FAILURE("aarch64-gic-v3", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST("aarch64-gic-host", + DO_TEST_GIC("aarch64-gic-v3", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v3", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v3", GIC_V3, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-v3", GIC_BOTH, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-host", + DO_TEST_FAILURE("aarch64-gic-host", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST); - DO_TEST_PARSE_ERROR("aarch64-gic-invalid", + DO_TEST_GIC("aarch64-gic-host", GIC_NONE, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-host", GIC_V2, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-host", GIC_V3, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_GIC("aarch64-gic-host", GIC_BOTH, + QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, + QEMU_CAPS_MACH_VIRT_GIC_VERSION); + DO_TEST_PARSE_ERROR("aarch64-gic-invalid", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-not-virt", + DO_TEST_FAILURE("aarch64-gic-not-virt", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION); - DO_TEST_FAILURE("aarch64-gic-not-arm", + DO_TEST_FAILURE("aarch64-gic-not-arm", GIC_NONE, QEMU_CAPS_KVM, QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_CPU_HOST, QEMU_CAPS_MACH_VIRT_GIC_VERSION);
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml new file mode 120000 index 0000000..f586fa1 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/qemuxml2argv-aarch64-gic-v3.xml \ No newline at end of file diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml new file mode 120000 index 0000000..80a01c2 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/qemuxml2argv-aarch64-gic-v2.xml \ No newline at end of file diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml new file mode 120000 index 0000000..f586fa1 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml @@ -0,0 +1 @@ +../qemuxml2argvdata/qemuxml2argv-aarch64-gic-v3.xml \ No newline at end of file diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 9d2109b..404cd10 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -775,11 +775,26 @@ mymain(void) QEMU_CAPS_OBJECT_GPEX, QEMU_CAPS_DEVICE_PCI_BRIDGE, QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE, QEMU_CAPS_VIRTIO_SCSI);
- DO_TEST("aarch64-gic-none"); - DO_TEST("aarch64-gic-default"); - DO_TEST("aarch64-gic-v2"); - DO_TEST("aarch64-gic-v3"); - DO_TEST("aarch64-gic-host"); + DO_TEST_FULL("aarch64-gic-none", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-none-v2", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-none-v3", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-none-both", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-default", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-v2", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-v3", WHEN_BOTH, GIC_BOTH, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_NONE, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_V2, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_V3, NONE); + DO_TEST_FULL("aarch64-gic-host", WHEN_BOTH, GIC_BOTH, NONE);
DO_TEST("memory-hotplug"); DO_TEST("memory-hotplug-nonuma");

On Tue, 2016-05-17 at 16:10 -0400, John Ferlan wrote:
On 05/16/2016 06:00 PM, Andrea Bolognani wrote:
The only case where the hardware capabilities influence the result is when no <gic/> element was provided.
The test programs now ensure both that the correct GIC version is picked in that case, and that hardware capabilities are not taken into account when the user has already picked a GIC version. --- .../qemuxml2argv-aarch64-gic-none-both.args | 1 + .../qemuxml2argv-aarch64-gic-none-both.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v2.args | 1 + .../qemuxml2argv-aarch64-gic-none-v2.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v3.args | 1 + .../qemuxml2argv-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2argvtest.c | 76 ++++++++++++++++++---- .../qemuxml2xmlout-aarch64-gic-none-both.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v2.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2xmltest.c | 25 +++++-- 11 files changed, 91 insertions(+), 19 deletions(-) create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml
This failed to apply - seemingly because there's QEMU_CAPS_CPU_HOST in here that has changed since you posted to X_QEMU_CAPS_CPU_HOST
But if I very carefully massage it, I was able to run the test - nothing like testing the crap out of things!
So ACK with the I hope obvious adjustment to remove QEMU_CAPS_CPU_HOST
Funny thing is, I'm the one who removed QEMU_CAPS_CPU_HOST in the fist place ;) Anyway, as you mentioned, the fix is very obvious. -- Andrea Bolognani Software Engineer - Virtualization Team

On Tue, 2016-05-17 at 00:00 +0200, Andrea Bolognani wrote:
Changes from [v1]:
* Factor away some of the logic to virQEMUCapsSupportsGICVersion(), as suggested by, and based on a first implementation by, Cole
* Factor away the common test suite bits to testutilsqemu.{h,c} to avoid code duplication
[v1] https://www.redhat.com/archives/libvir-list/2016-May/msg00637.html
Andrea Bolognani (5): qemu: Add virQEMUCapsSupportsGICVersion() qemu: Automatically choose usable GIC version qemu: Add virQEMUCapsSetGICCapabilities() tests: Prepare to have different usable GIC versions tests: Try different usable GIC versions
src/qemu/qemu_capabilities.c | 91 ++++++++++-- src/qemu/qemu_capabilities.h | 9 ++ src/qemu/qemu_domain.c | 49 +++++-- .../qemuxml2argv-aarch64-gic-none-both.args | 1 + .../qemuxml2argv-aarch64-gic-none-both.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v2.args | 1 + .../qemuxml2argv-aarch64-gic-none-v2.xml | 1 + .../qemuxml2argv-aarch64-gic-none-v3.args | 1 + .../qemuxml2argv-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2argvtest.c | 125 +++++++++++++---- .../qemuxml2xmlout-aarch64-gic-none-both.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v2.xml | 1 + .../qemuxml2xmlout-aarch64-gic-none-v3.xml | 1 + tests/qemuxml2xmltest.c | 155 ++++++++++++--------- tests/testutilsqemu.c | 36 +++++ tests/testutilsqemu.h | 10 ++ 16 files changed, 361 insertions(+), 123 deletions(-) create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.args create mode 120000 tests/qemuxml2argvdata/qemuxml2argv-aarch64-gic-none-v3.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-both.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v2.xml create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-aarch64-gic-none-v3.xml
The series has been pushed after addressing the issues pointed out during review. Thanks John! -- Andrea Bolognani Software Engineer - Virtualization Team
participants (2)
-
Andrea Bolognani
-
John Ferlan