[PATCH 2/2] qemu_capabilities.c: drop 'kvm_pr' support for non-Power8 hosts

Richard W.M. Jones rjones at redhat.com
Mon Jun 29 09:01:29 UTC 2020


On Fri, Jun 19, 2020 at 06:04:33PM -0300, Daniel Henrique Barboza wrote:
> 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

I'm sorry I don't have a way to test this patch.  However it looks
reasonable from here based on the description above and the changes to
the code below, so ACK.

Rich.

> CC: Leonardo Augusto Guimarães Garcia <lagarcia at br.ibm.com>
> CC: Greg Kurz <groug at kaod.org>
> CC: David Gibson <david at gibson.dropbear.id.au>
> CC: Richard W.M. Jones <rjones at redhat.com>
> Signed-off-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
> ---
>  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

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org




More information about the libvir-list mailing list