From 8910e063dbafc09695b2100c80213be569abb7ef Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Wed, 6 May 2015 18:32:05 -0400 Subject: [PATCH] caps: Fix regression defaulting to host arch My commit 747761a79 (v1.2.15 only) dropped this bit of logic when filling in a default arch in the XML: - /* First try to find one matching host arch */ - for (i = 0; i < caps->nguests; i++) { - if (caps->guests[i]->ostype == ostype) { - for (j = 0; j < caps->guests[i]->arch.ndomains; j++) { - if (caps->guests[i]->arch.domains[j]->type == domain && - caps->guests[i]->arch.id == caps->host.arch) - return caps->guests[i]->arch.id; - } - } - } That attempt to match host.arch is important, otherwise we end up defaulting to i686 on x86_64 host for KVM, which is not intended. Duplicate it in the centralized CapsLookup function. Additionally add some testcases that would have caught this. https://bugzilla.redhat.com/show_bug.cgi?id=1219191 --- src/conf/capabilities.c | 63 +++++++++++++------ .../qemuxml2argv-default-kvm-host-arch.args | 4 ++ .../qemuxml2argv-default-kvm-host-arch.xml | 11 ++++ .../qemuxml2argv-default-qemu-host-arch.args | 4 ++ .../qemuxml2argv-default-qemu-host-arch.xml | 11 ++++ tests/qemuxml2argvtest.c | 2 + .../qemuxml2xmlout-default-kvm-host-arch.xml | 21 +++++++ .../qemuxml2xmlout-default-qemu-host-arch.xml | 21 +++++++ tests/qemuxml2xmltest.c | 2 + tests/testutilsqemu.c | 12 ++++ 10 files changed, 132 insertions(+), 19 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-default-kvm-host-arch.xml create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-default-qemu-host-arch.xml diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 922741fe25..c43bfb33e1 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -607,25 +607,13 @@ virCapsDomainDataCompare(virCapsGuestPtr guest, return true; } -/** - * virCapabilitiesDomainDataLookup: - * @caps: capabilities to query - * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE - * @arch: Architecture to search for - * @domaintype: domain type to search for, of enum VIR_DOMAIN_VIRT - * @emulator: Emulator path to search for - * @machinetype: Machine type to search for - * - * Search capabilities for the passed values, and if found return - * virCapabilitiesDomainDataLookup filled in with the default values - */ -virCapsDomainDataPtr -virCapabilitiesDomainDataLookup(virCapsPtr caps, - int ostype, - virArch arch, - int domaintype, - const char *emulator, - const char *machinetype) +static virCapsDomainDataPtr +virCapabilitiesDomainDataLookupInternal(virCapsPtr caps, + int ostype, + virArch arch, + int domaintype, + const char *emulator, + const char *machinetype) { virCapsGuestPtr foundguest = NULL; virCapsGuestDomainPtr founddomain = NULL; @@ -730,6 +718,43 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps, return ret; } +/** + * virCapabilitiesDomainDataLookup: + * @caps: capabilities to query + * @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE + * @arch: Architecture to search for + * @domaintype: domain type to search for, of enum VIR_DOMAIN_VIRT + * @emulator: Emulator path to search for + * @machinetype: Machine type to search for + * + * Search capabilities for the passed values, and if found return + * virCapabilitiesDomainDataLookup filled in with the default values + */ +virCapsDomainDataPtr +virCapabilitiesDomainDataLookup(virCapsPtr caps, + int ostype, + virArch arch, + int domaintype, + const char *emulator, + const char *machinetype) +{ + virCapsDomainDataPtr ret; + + if (arch == VIR_ARCH_NONE) { + /* Prefer host arch if its available */ + ret = virCapabilitiesDomainDataLookupInternal(caps, ostype, + caps->host.arch, + domaintype, + emulator, machinetype); + if (ret) + return ret; + } + + return virCapabilitiesDomainDataLookupInternal(caps, ostype, + arch, domaintype, + emulator, machinetype); +} + static int virCapabilitiesFormatNUMATopology(virBufferPtr buf, size_t ncells, diff --git a/tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.args b/tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.args new file mode 100644 index 0000000000..102691f642 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.args @@ -0,0 +1,4 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/kvm -S -machine pc,accel=kvm -m 4096 -smp 4 -nographic \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -net none \ +-serial none -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.xml b/tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.xml new file mode 100644 index 0000000000..66dead0134 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-default-kvm-host-arch.xml @@ -0,0 +1,11 @@ + + kvm + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.args b/tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.args new file mode 100644 index 0000000000..5bd404ced0 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.args @@ -0,0 +1,4 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 -S -machine pc-0.11,accel=tcg -m 4096 -smp 4 \ +-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-usb -net none -serial none -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.xml b/tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.xml new file mode 100644 index 0000000000..85ddec560d --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-default-qemu-host-arch.xml @@ -0,0 +1,11 @@ + + qemu-host + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index aa158225c8..e67d909d6a 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -599,6 +599,8 @@ mymain(void) DO_TEST_FAILURE("machine-xen-vmport-opt", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MACHINE_VMPORT_OPT); DO_TEST("kvm", QEMU_CAPS_MACHINE_OPT); + DO_TEST("default-kvm-host-arch", QEMU_CAPS_MACHINE_OPT); + DO_TEST("default-qemu-host-arch", QEMU_CAPS_MACHINE_OPT); DO_TEST("boot-cdrom", NONE); DO_TEST("boot-network", NONE); DO_TEST("boot-floppy", NONE); diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-default-kvm-host-arch.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-default-kvm-host-arch.xml new file mode 100644 index 0000000000..30fa66dc57 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-default-kvm-host-arch.xml @@ -0,0 +1,21 @@ + + kvm + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + + destroy + restart + destroy + + /usr/bin/kvm + + + + + diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-default-qemu-host-arch.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-default-qemu-host-arch.xml new file mode 100644 index 0000000000..3e65b97efa --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-default-qemu-host-arch.xml @@ -0,0 +1,21 @@ + + qemu-host + d091ea82-29e6-2e34-3005-f02617b36e87 + 4194304 + 4194304 + 4 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-x86_64 + + + + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index d41877670b..2c53d7c1a1 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -346,6 +346,8 @@ mymain(void) DO_TEST("minimal"); DO_TEST("machine-core-on"); DO_TEST("machine-core-off"); + DO_TEST_DIFFERENT("default-kvm-host-arch"); + DO_TEST_DIFFERENT("default-qemu-host-arch"); DO_TEST("boot-cdrom"); DO_TEST("boot-network"); DO_TEST("boot-floppy"); diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 14743beb41..d067bca2a1 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -354,6 +354,18 @@ virCapsPtr testQemuCapsInit(void) NULL) == NULL) goto cleanup; + if ((machines = testQemuAllocMachines(&nmachines)) == NULL) + goto cleanup; + + if (virCapabilitiesAddGuestDomain(guest, + VIR_DOMAIN_VIRT_KVM, + "/usr/bin/qemu-kvm", + NULL, + nmachines, + machines) == NULL) + goto cleanup; + machines = NULL; + if ((machines = testQemuAllocNewerMachines(&nmachines)) == NULL) goto cleanup;