[libvirt] [PATCH] qemu: Add conditions for qemu-kvm use on ppc64

qemu-kvm can be used to run ppc64 guests on ppc64le hosts and vice versa, since the hardware is actually the same and the endianness is chosen by the guest kernel. Up until now, however, libvirt didn't allow the use of qemu-kvm to run guests if their endianness didn't match the host's. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1267882 --- src/qemu/qemu_capabilities.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index eb2edf5..8253398 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -768,7 +768,7 @@ virQEMUCapsInitGuest(virCapsPtr caps, char *binary = NULL; virQEMUCapsPtr qemubinCaps = NULL; virQEMUCapsPtr kvmbinCaps = NULL; - bool native_kvm, x86_32on64_kvm, arm_32on64_kvm; + bool native_kvm, x86_32on64_kvm, arm_32on64_kvm, ppc64_kvm; int ret = -1; /* Check for existence of base emulator, or alternate base @@ -788,14 +788,16 @@ virQEMUCapsInitGuest(virCapsPtr caps, * - host & guest arches match * - hostarch is x86_64 and guest arch is i686 (needs -cpu qemu32) * - hostarch is aarch64 and guest arch is armv7l (needs -cpu aarch64=off) + * - hostarch and guestarch are both ppc64* */ native_kvm = (hostarch == guestarch); x86_32on64_kvm = (hostarch == VIR_ARCH_X86_64 && guestarch == VIR_ARCH_I686); arm_32on64_kvm = (hostarch == VIR_ARCH_AARCH64 && guestarch == VIR_ARCH_ARMV7L); + ppc64_kvm = (ARCH_IS_PPC64(hostarch) && ARCH_IS_PPC64(guestarch)); - if (native_kvm || x86_32on64_kvm || arm_32on64_kvm) { + if (native_kvm || x86_32on64_kvm || arm_32on64_kvm || ppc64_kvm) { const char *kvmbins[] = { "/usr/libexec/qemu-kvm", /* RHEL */ "qemu-kvm", /* Fedora */ -- 2.4.3

On Thu, Oct 01, 2015 at 14:47:11 +0200, Andrea Bolognani wrote:
qemu-kvm can be used to run ppc64 guests on ppc64le hosts and vice versa, since the hardware is actually the same and the endianness is chosen by the guest kernel.
Up until now, however, libvirt didn't allow the use of qemu-kvm to run guests if their endianness didn't match the host's.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1267882 --- src/qemu/qemu_capabilities.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index eb2edf5..8253398 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -768,7 +768,7 @@ virQEMUCapsInitGuest(virCapsPtr caps, char *binary = NULL; virQEMUCapsPtr qemubinCaps = NULL; virQEMUCapsPtr kvmbinCaps = NULL; - bool native_kvm, x86_32on64_kvm, arm_32on64_kvm; + bool native_kvm, x86_32on64_kvm, arm_32on64_kvm, ppc64_kvm; int ret = -1;
/* Check for existence of base emulator, or alternate base @@ -788,14 +788,16 @@ virQEMUCapsInitGuest(virCapsPtr caps, * - host & guest arches match * - hostarch is x86_64 and guest arch is i686 (needs -cpu qemu32) * - hostarch is aarch64 and guest arch is armv7l (needs -cpu aarch64=off) + * - hostarch and guestarch are both ppc64* */ native_kvm = (hostarch == guestarch); x86_32on64_kvm = (hostarch == VIR_ARCH_X86_64 && guestarch == VIR_ARCH_I686); arm_32on64_kvm = (hostarch == VIR_ARCH_AARCH64 && guestarch == VIR_ARCH_ARMV7L); + ppc64_kvm = (ARCH_IS_PPC64(hostarch) && ARCH_IS_PPC64(guestarch));
- if (native_kvm || x86_32on64_kvm || arm_32on64_kvm) { + if (native_kvm || x86_32on64_kvm || arm_32on64_kvm || ppc64_kvm) { const char *kvmbins[] = { "/usr/libexec/qemu-kvm", /* RHEL */ "qemu-kvm", /* Fedora */
I wonder if this case shouldn't somehow fall into the hostarch == guestarch case, via something like native_kvm = ARCH_CANONICAL(hostarch) == ARCH_CANONICAL(guestarch), but probably not since it maybe non-trivial (and depending on the actual usage) what a canonical architecture would be for every given architecture we support. In other words, ACK :-) Jirka

On Thu, 2015-10-01 at 17:00 +0200, Jiri Denemark wrote:
I wonder if this case shouldn't somehow fall into the hostarch == guestarch case, via something like native_kvm = ARCH_CANONICAL(hostarch) == ARCH_CANONICAL(guestarch), but probably not since it maybe non-trivial (and depending on the actual usage) what a canonical architecture would be for every given architecture we support.
I doubt something like ARCH_CANONICAL() could ever be implemented, but I'm all for cleaning up the current logic and moving it to a single place for easier maintenance. virQEMUCapsFindTarget() can be considered a first step in that direction. A lot more work is still needed, though.
In other words, ACK :-)
Thanks :) -- Andrea Bolognani Software Engineer - Virtualization Team
participants (2)
-
Andrea Bolognani
-
Jiri Denemark