PPC64 has two KVM modules: kvm_hv and kvm_pr. The official supported module was always kvm_hv, while kvm_pr was used for internal testing or for very niche cases in Power 8 hosts, always without official IBM or distro support. Problem is, QMP will report KVM supportfor PPC64 if any of these modules is loaded in the host, and kvm_pr is broken in everything but Power8 (and will remain broken, since kvm_pr is unmaintained). This can lead to situations like [1], where the tooling is misled to believe that the host has KVM capabilities when in reality it doesn't. The first reaction would be to simply forsake kvm_pr support entirely and move on, but there is no reason for now to be disruptive with any Power8 guests in the wild that are using kvm_pr (somehow). A more subtle approach is to not claim QEMU_CAPS_KVM support in all cases that we know it's completely broken, allowing Power8 users to take their shot using kvm_pr in their VMs. We can remove kvm_pr support completely when the module is removed from the kernel. [1] https://bugzilla.redhat.com/show_bug.cgi?id=1843865 CC: Leonardo Augusto Guimarães Garcia <lagarcia@xxxxxxxxxx> CC: Greg Kurz <groug@xxxxxxxx> CC: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> CC: Richard W.M. Jones <rjones@xxxxxxxxxx> Signed-off-by: Daniel Henrique Barboza <danielhb413@xxxxxxxxx> --- src/qemu/qemu_capabilities.c | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 484fff99e5..b1c1d4dd70 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -49,6 +49,7 @@ #include "qemu_process.h" #include "qemu_firmware.h" #include "virutil.h" +#include "virkmod.h" #include <fcntl.h> #include <sys/stat.h> @@ -3242,6 +3243,31 @@ virQEMUCapsProbeQMPTPM(virQEMUCapsPtr qemuCaps, } +static void +virQEMUCapsSetPPC64KVMState(virQEMUCapsPtr qemuCaps, virArch hostArch) +{ + g_autoptr(virCPUDef) hostCPU = virCPUProbeHost(hostArch); + + /* At this moment, PPC64 has two KVM modules: kvm_hv and kvm_pr. + * QEMU will return KVM present and enabled = true if any of these + * is loaded in the host. Thing is, kvm_pr was never officially + * supported by IBM or any other distro, but people still ended + * up using it in Power8 hosts regardless. It is also currently + * unmaintained and broken on Power9, and will be sunset in the + * future. kvm_hv is the only KVM module that is and will be + * supported. + * + * Until then, do not claim QEMU_CAPS_KVM if there is only kvm_pr + * loaded in the host. There is a good chance that there are + * unsupported kvm_pr Power8 guests running in the wild, so let's + * cut some slack for this case, for now. */ + if (STRNEQLEN(hostCPU->model, "POWER8", 6) && !virKModIsLoaded("kvm_hv")) + return; + + virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM); +} + + static int virQEMUCapsProbeQMPKVMState(virQEMUCapsPtr qemuCaps, qemuMonitorPtr mon) @@ -3252,8 +3278,16 @@ virQEMUCapsProbeQMPKVMState(virQEMUCapsPtr qemuCaps, if (qemuMonitorGetKVMState(mon, &enabled, &present) < 0) return -1; - if (present && enabled) - virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM); + if (present && enabled) { + virArch hostArch = virArchFromHost(); + + if (ARCH_IS_PPC64(hostArch)) { + virQEMUCapsSetPPC64KVMState(qemuCaps, hostArch); + return 0; + } + + virQEMUCapsSet(qemuCaps, QEMU_CAPS_KVM); + } return 0; } -- 2.26.2