mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 01:04:59 +00:00
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
This commit is contained in:
parent
fd74e23175
commit
8910e063db
@ -607,25 +607,13 @@ virCapsDomainDataCompare(virCapsGuestPtr guest,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static virCapsDomainDataPtr
|
||||||
* virCapabilitiesDomainDataLookup:
|
virCapabilitiesDomainDataLookupInternal(virCapsPtr caps,
|
||||||
* @caps: capabilities to query
|
int ostype,
|
||||||
* @ostype: guest operating system type, of enum VIR_DOMAIN_OSTYPE
|
virArch arch,
|
||||||
* @arch: Architecture to search for
|
int domaintype,
|
||||||
* @domaintype: domain type to search for, of enum VIR_DOMAIN_VIRT
|
const char *emulator,
|
||||||
* @emulator: Emulator path to search for
|
const char *machinetype)
|
||||||
* @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)
|
|
||||||
{
|
{
|
||||||
virCapsGuestPtr foundguest = NULL;
|
virCapsGuestPtr foundguest = NULL;
|
||||||
virCapsGuestDomainPtr founddomain = NULL;
|
virCapsGuestDomainPtr founddomain = NULL;
|
||||||
@ -730,6 +718,43 @@ virCapabilitiesDomainDataLookup(virCapsPtr caps,
|
|||||||
return ret;
|
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
|
static int
|
||||||
virCapabilitiesFormatNUMATopology(virBufferPtr buf,
|
virCapabilitiesFormatNUMATopology(virBufferPtr buf,
|
||||||
size_t ncells,
|
size_t ncells,
|
||||||
|
@ -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
|
@ -0,0 +1,11 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>kvm</name>
|
||||||
|
<uuid>d091ea82-29e6-2e34-3005-f02617b36e87</uuid>
|
||||||
|
<memory unit='KiB'>4194304</memory>
|
||||||
|
<currentMemory unit='KiB'>4194304</currentMemory>
|
||||||
|
<vcpu placement='static'>4</vcpu>
|
||||||
|
<os>
|
||||||
|
<type>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
</domain>
|
@ -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
|
@ -0,0 +1,11 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>qemu-host</name>
|
||||||
|
<uuid>d091ea82-29e6-2e34-3005-f02617b36e87</uuid>
|
||||||
|
<memory unit='KiB'>4194304</memory>
|
||||||
|
<currentMemory unit='KiB'>4194304</currentMemory>
|
||||||
|
<vcpu placement='static'>4</vcpu>
|
||||||
|
<os>
|
||||||
|
<type>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
</domain>
|
@ -599,6 +599,8 @@ mymain(void)
|
|||||||
DO_TEST_FAILURE("machine-xen-vmport-opt", QEMU_CAPS_MACHINE_OPT,
|
DO_TEST_FAILURE("machine-xen-vmport-opt", QEMU_CAPS_MACHINE_OPT,
|
||||||
QEMU_CAPS_MACHINE_VMPORT_OPT);
|
QEMU_CAPS_MACHINE_VMPORT_OPT);
|
||||||
DO_TEST("kvm", QEMU_CAPS_MACHINE_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-cdrom", NONE);
|
||||||
DO_TEST("boot-network", NONE);
|
DO_TEST("boot-network", NONE);
|
||||||
DO_TEST("boot-floppy", NONE);
|
DO_TEST("boot-floppy", NONE);
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>kvm</name>
|
||||||
|
<uuid>d091ea82-29e6-2e34-3005-f02617b36e87</uuid>
|
||||||
|
<memory unit='KiB'>4194304</memory>
|
||||||
|
<currentMemory unit='KiB'>4194304</currentMemory>
|
||||||
|
<vcpu placement='static'>4</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/kvm</emulator>
|
||||||
|
<controller type='usb' index='0'/>
|
||||||
|
<controller type='pci' index='0' model='pci-root'/>
|
||||||
|
<memballoon model='virtio'/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -0,0 +1,21 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>qemu-host</name>
|
||||||
|
<uuid>d091ea82-29e6-2e34-3005-f02617b36e87</uuid>
|
||||||
|
<memory unit='KiB'>4194304</memory>
|
||||||
|
<currentMemory unit='KiB'>4194304</currentMemory>
|
||||||
|
<vcpu placement='static'>4</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc-0.11'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
||||||
|
<controller type='usb' index='0'/>
|
||||||
|
<controller type='pci' index='0' model='pci-root'/>
|
||||||
|
<memballoon model='virtio'/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -346,6 +346,8 @@ mymain(void)
|
|||||||
DO_TEST("minimal");
|
DO_TEST("minimal");
|
||||||
DO_TEST("machine-core-on");
|
DO_TEST("machine-core-on");
|
||||||
DO_TEST("machine-core-off");
|
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-cdrom");
|
||||||
DO_TEST("boot-network");
|
DO_TEST("boot-network");
|
||||||
DO_TEST("boot-floppy");
|
DO_TEST("boot-floppy");
|
||||||
|
@ -354,6 +354,18 @@ virCapsPtr testQemuCapsInit(void)
|
|||||||
NULL) == NULL)
|
NULL) == NULL)
|
||||||
goto cleanup;
|
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)
|
if ((machines = testQemuAllocNewerMachines(&nmachines)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user