[PATCH] qemu: capabilities: Remove check for /usr/libexec/qemu-kvm

Andrea Bolognani abologna at redhat.com
Wed Mar 30 16:59:11 UTC 2022

On Mon, Mar 28, 2022 at 02:38:38PM -0600, Jim Fehlig wrote:
> A downstream packaging bug resulted in a scenario where no aarch64 emulator
> binary was installed on a kvm host. Querying capabilities on the host
> succeeds and the capabilities correctly report that no <guest>'s are
> supported, but the following error is logged
> libvirtd: Cannot check QEMU binary /usr/libexec/qemu-kvm: No such file or directory
> This error is confusing and not very helpful. Additionally, comments in the
> associated code note that /usr/libexec/qemu-kvm is disto-specific, which
> suggests the logic is better suited for a downstream patch. Removing the
> check for /usr/libexec/qemu-kvm leaves virQEMUCapsGetDefaultEmulator() as
> nothing more than a needless wrapper around virQEMUCapsFindBinaryForArch.
> Drop virQEMUCapsGetDefaultEmulator() and call virQEMUCapsFindBinaryForArch()
> directly in its place, which squelches the unhelpful error.

I agree that the message being logged is not very useful, but I don't
think the approach you take here is the correct one: we want upstream
libvirt to work out of the box when built on a variety of distros,
including RHEL and derivatives, and your patch breaks that.

I think the diff you're looking for is more along the lines of the
(completely untested) one below. You can then rename
virQEMUCapsFindBinaryForArch() to virQEMUCapsGetDefaultEmulator() in
a second patch to avoid leaving unnecessary wrappers around.

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 6b4ed08499..e35a89f944 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -945,6 +945,12 @@ virQEMUCapsFindBinaryForArch(virArch hostarch,
             return ret;

+    if (virQEMUCapsGuestIsNative(hostarch, guestarch)) {
+        if ((ret = virFindFileInPath("/usr/libexec/qemu-kvm")) != NULL) {
+            return ret;
+        }
+    }
     return ret;

@@ -953,18 +959,7 @@ char *
 virQEMUCapsGetDefaultEmulator(virArch hostarch,
                               virArch guestarch)
-    char *binary = NULL;
-    /* Check for existence of base emulator, or alternate base
-     * which can be used with magic cpu choice
-     */
-    binary = virQEMUCapsFindBinaryForArch(hostarch, guestarch);
-    /* RHEL doesn't follow the usual naming for QEMU binaries and ships
-     * a single binary named qemu-kvm outside of $PATH instead */
-    if (virQEMUCapsGuestIsNative(hostarch, guestarch) && !binary)
-        binary = g_strdup("/usr/libexec/qemu-kvm");
-    return binary;
+    return virQEMUCapsFindBinaryForArch(hostarch, guestarch);
Andrea Bolognani / Red Hat / Virtualization

More information about the libvir-list mailing list