[libvirt] [PATCH] domcaps: Check for architecture more wisely

Michal Privoznik mprivozn at redhat.com
Thu Apr 9 08:00:49 UTC 2015

On 08.04.2015 17:25, Cole Robinson wrote:
> On 04/08/2015 11:12 AM, Michal Privoznik wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=1209948
>> So we have this bug. The virConnectGetDomainCapabilities() API
>> performs a couple of checks before it produces any result. One of
>> the checks is if the architecture requested by user can be run by
>> the binary (again user provided). However, the check is pretty
>> dumb. It merely compares if the default binary architecture
>> matches the one provided by user. However, a qemu binary can run
>> multiple architectures. For instance: qemu-system-ppc64 can run:
>> ppc, ppcle, ppc64, ppc64le and ppcemb. The default is ppc64, so
>> if user requested something else, like ppc64le, the check would
>> have failed without obvious reason.
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>  src/qemu/qemu_driver.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 921417c..d217481 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -18788,7 +18788,10 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
>>          arch_from_caps = virQEMUCapsGetArch(qemuCaps);
>>          if (arch_from_caps != arch &&
>> -            (arch_from_caps != VIR_ARCH_X86_64 || arch != VIR_ARCH_I686)) {
>> +            !((ARCH_IS_X86(arch) && ARCH_IS_X86(arch_from_caps)) ||
>> +              (ARCH_IS_PPC(arch) && ARCH_IS_PPC(arch_from_caps)) ||
>> +              (ARCH_IS_ARM(arch) && ARCH_IS_ARM(arch_from_caps)) ||
>> +              (ARCH_IS_S390(arch) && ARCH_IS_S390(arch_from_caps)))) {
>>              virReportError(VIR_ERR_INVALID_ARG,
>>                             _("architecture from emulator '%s' doesn't "
>>                               "match given architecture '%s'"),
> As I mentioned in the bug, really I think this is more a problem of the
> virQEMUCapsCacheLookup* interface. Nowadays we can have the same emulatorbin
> map to multiple architectures, and the same architecture provided by multiple
> emulators, so CacheLookup* functions that search for only the specified
> emulator or only the specified arch are just going to breed more bugs like this.

While I understand your concern, qemu is not helping. It is not
exporting list of supported architectures for given binary. What I've
found is:

a) we use 'query-target' command to determine the target architecture
for the binary. However, this returns only the default architecture, not
a list of all supported architectures.

b) There exists 'qemu-system-* -cpu ?', which outputs something like this:

x86           athlon  QEMU Virtual CPU version 2.2.92
x86        Broadwell  Intel Core Processor (Broadwell)

The first item looks like an arch. But it's not much of a help either.
For example for qemu-system-{i386,x86_64} I get the very same list of
supported CPUs. And architectures too. But if I query those two binaries
on QMP for their target they produce different results: 'i386' and 'x86_64'.

While I agree your approach is better, there's not much we can do unless
qemu is more helping. So I see two options:

1) ask qemu devels

2) merge this meanwhile


More information about the libvir-list mailing list