• D
    target/ppc: 'PVR != host PVR' in KVM_SET_SREGS workaround · c363a37a
    Daniel Henrique Barboza 提交于
    Commit d5fc133e ("ppc: Rework CPU compatibility testing
    across migration") changed the way cpu_post_load behaves with
    the PVR setting, causing an unexpected bug in KVM-HV migrations
    between hosts that are compatible (POWER8 and POWER8E, for example).
    Even with pvr_match() returning true, the guest freezes right after
    cpu_post_load. The reason is that the guest kernel can't handle a
    different PVR value other that the running host in KVM_SET_SREGS.
    
    In [1] it was discussed the possibility of a new KVM capability
    that would indicate that the guest kernel can handle a different
    PVR in KVM_SET_SREGS. Even if such feature is implemented, there is
    still the problem with older kernels that will not have this capability
    and will fail to migrate.
    
    This patch implements a workaround for that scenario. If running
    with KVM, check if the guest kernel does not have the capability
    (named here as 'cap_ppc_pvr_compat'). If it doesn't, calls
    kvmppc_is_pr() to see if the guest is running in KVM-HV. If all this
    happens, set env->spr[SPR_PVR] to the same value as the current
    host PVR. This ensures that we allow migrations with 'close enough'
    PVRs to still work in KVM-HV but also makes the code ready for
    this new KVM capability when it is done.
    
    A new function called 'kvmppc_pvr_workaround_required' was created
    to encapsulate the conditions said above and to avoid calling too
    many kvm.c internals inside cpu_post_load.
    
    [1] https://lists.gnu.org/archive/html/qemu-ppc/2017-06/msg00503.htmlSigned-off-by: NDaniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
    [dwg: Fix for the case of using TCG on a PPC host]
    Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
    c363a37a
kvm.c 78.0 KB