diff --git a/0001-caps-Don-t-default-to-i686-of-KVM-on-x86_64.patch b/0001-caps-Don-t-default-to-i686-of-KVM-on-x86_64.patch new file mode 100644 index 0000000..379440e --- /dev/null +++ b/0001-caps-Don-t-default-to-i686-of-KVM-on-x86_64.patch @@ -0,0 +1,225 @@ +From 31479ae566d887ce4b864ef84fee99305041aaf1 Mon Sep 17 00:00:00 2001 +From: Cole Robinson +Date: Wed, 6 May 2015 18:59:46 -0400 +Subject: [PATCH] caps: Don't default to i686 of KVM on x86_64 + +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 +(cherry picked from commit 67b3c04b139d697e4aab01c0f676e356bbef5c52) +--- + src/conf/capabilities.c | 63 +++++++++++++++------- + .../qemuxml2argv-default-kvm-host-arch.args | 4 ++ + .../qemuxml2argv-default-kvm-host-arch.xml | 11 ++++ + tests/qemuxml2argvtest.c | 1 + + .../qemuxml2xmlout-default-kvm-host-arch.xml | 21 ++++++++ + tests/qemuxml2xmltest.c | 1 + + tests/testutilsqemu.c | 12 +++++ + 7 files changed, 94 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/qemuxml2xmloutdata/qemuxml2xmlout-default-kvm-host-arch.xml + +diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c +index 922741f..c43bfb3 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 0000000..102691f +--- /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 0000000..66dead0 +--- /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/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c +index 4acaa11..df4c9f5 100644 +--- a/tests/qemuxml2argvtest.c ++++ b/tests/qemuxml2argvtest.c +@@ -595,6 +595,7 @@ mymain(void) + DO_TEST("machine-usb-opt", QEMU_CAPS_MACHINE_OPT, + QEMU_CAPS_MACHINE_USB_OPT); + DO_TEST("kvm", QEMU_CAPS_MACHINE_OPT); ++ DO_TEST("default-kvm-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 0000000..30fa66d +--- /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/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c +index b611afd..a21a299 100644 +--- a/tests/qemuxml2xmltest.c ++++ b/tests/qemuxml2xmltest.c +@@ -346,6 +346,7 @@ mymain(void) + DO_TEST("minimal"); + DO_TEST("machine-core-on"); + DO_TEST("machine-core-off"); ++ DO_TEST_DIFFERENT("default-kvm-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 14743be..d067bca 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; + +-- +2.3.1 + diff --git a/libvirt.spec b/libvirt.spec index 463bf24..a535dd5 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -378,7 +378,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 1.2.15 -Release: 1%{?dist}%{?extra_release} +Release: 2%{?dist}%{?extra_release} License: LGPLv2+ Group: Development/Libraries BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root @@ -389,6 +389,8 @@ URL: http://libvirt.org/ %endif Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.gz +Patch1: 0001-caps-Don-t-default-to-i686-of-KVM-on-x86_64.patch + %if %{with_libvirtd} Requires: libvirt-daemon = %{version}-%{release} %if %{with_network} @@ -2305,6 +2307,9 @@ exit 0 %doc examples/systemtap %changelog +* Thu May 07 2015 Richard W.M. Jones - 1.2.15-2 +- Add Cole Robinson's patch to fix arch selection (bz# 1219198, bz#1219191) + * Mon May 04 2015 Cole Robinson - 1.2.15-1 - Rebased to version 1.2.15