[libvirt PATCH] qemu: fixing auto-detecting binary in domain capabilities
Ján Tomko
jtomko at redhat.com
Fri Jan 17 13:54:53 UTC 2020
On Fri, Jan 17, 2020 at 01:29:36PM +0000, Daniel P. Berrangé wrote:
>The virConnectGetDomainCapabilities API accepts either a binary path
>to the emulator, or desired guest arch. If guest arch is not given,
>then the host arch is assumed.
>
>In the case where the binary is not given, the code tried to find the
>emulator binary in the existing list of cached emulator capabilities.
>This is not valid since we switched to lazy population of the cache in:
>
> commit 3dd91af01f30c5bda6328454ef49f3afece755d6
> Author: Daniel P. Berrangé <berrange at redhat.com>
> Date: Mon Dec 2 13:04:26 2019 +0000
>
> qemu: stop creating capabilities at driver startup
>
>As a result of this change, if there are no persistent guests defined
>using the requested guest architecture, virConnectGetDomainCapabilities
>will fail to find an emulator binary.
>
>The solution is to stop relying on the cached capabilities to find the
>binary and instead use the same logic we use to pick default a binary
>per arch when populating capabilities.
>
This does fix the problem for machines with no persistent guests, but
breaks domcapabilities for machines where there is no QEMU in the
default location - before this patch I'd get domcapabilities for /usr/libexec/qemu-git
(taken from the persistent config), after I get an error:
error: failed to get emulator capabilities
error: Cannot check QEMU binary /usr/libexec/qemu-kvm: No such file or directory
Should we keep the cache lookup as a fallback or vice-versa?
>Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
>---
> src/qemu/qemu_capabilities.c | 42 ++++++++++++++++--------------------
> 1 file changed, 19 insertions(+), 23 deletions(-)
>
>diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>index 498348ad58..9017e8d920 100644
>--- a/src/qemu/qemu_capabilities.c
>+++ b/src/qemu/qemu_capabilities.c
>@@ -5280,10 +5280,12 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache,
> const char **retMachine)
> {
> int virttype = VIR_DOMAIN_VIRT_NONE;
>- int arch = virArchFromHost();
>+ virArch hostarch = virArchFromHost();
>+ virArch arch = hostarch;
> virDomainVirtType capsType;
> virQEMUCapsPtr qemuCaps = NULL;
> virQEMUCapsPtr ret = NULL;
>+ virArch arch_from_caps;
>
> if (virttypeStr &&
> (virttype = virDomainVirtTypeFromString(virttypeStr)) < 0) {
>@@ -5299,31 +5301,25 @@ virQEMUCapsCacheLookupDefault(virFileCachePtr cache,
> goto cleanup;
> }
>
>- if (binary) {
>- virArch arch_from_caps;
>+ if (!binary)
>+ binary = virQEMUCapsGetDefaultEmulator(hostarch, arch);
virQEMUCapsGetDefaultEmulator returns an allocated string so it needs to
be freed.
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20200117/af60e24c/attachment-0001.sig>
More information about the libvir-list
mailing list