lkml.org 
[lkml]   [2019]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 007/114] KVM: PPC: Book3S HV: Dont lose pending doorbell request on migration on P9
    Date
    From: Paul Mackerras <paulus@ozlabs.org>

    commit ff42df49e75f053a8a6b4c2533100cdcc23afe69 upstream.

    On POWER9, when userspace reads the value of the DPDES register on a
    vCPU, it is possible for 0 to be returned although there is a doorbell
    interrupt pending for the vCPU. This can lead to a doorbell interrupt
    being lost across migration. If the guest kernel uses doorbell
    interrupts for IPIs, then it could malfunction because of the lost
    interrupt.

    This happens because a newly-generated doorbell interrupt is signalled
    by setting vcpu->arch.doorbell_request to 1; the DPDES value in
    vcpu->arch.vcore->dpdes is not updated, because it can only be updated
    when holding the vcpu mutex, in order to avoid races.

    To fix this, we OR in vcpu->arch.doorbell_request when reading the
    DPDES value.

    Cc: stable@vger.kernel.org # v4.13+
    Fixes: 579006944e0d ("KVM: PPC: Book3S HV: Virtualize doorbell facility on POWER9")
    Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
    Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/kvm/book3s_hv.c | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    --- a/arch/powerpc/kvm/book3s_hv.c
    +++ b/arch/powerpc/kvm/book3s_hv.c
    @@ -1407,7 +1407,14 @@ static int kvmppc_get_one_reg_hv(struct
    *val = get_reg_val(id, vcpu->arch.pspb);
    break;
    case KVM_REG_PPC_DPDES:
    - *val = get_reg_val(id, vcpu->arch.vcore->dpdes);
    + /*
    + * On POWER9, where we are emulating msgsndp etc.,
    + * we return 1 bit for each vcpu, which can come from
    + * either vcore->dpdes or doorbell_request.
    + * On POWER8, doorbell_request is 0.
    + */
    + *val = get_reg_val(id, vcpu->arch.vcore->dpdes |
    + vcpu->arch.doorbell_request);
    break;
    case KVM_REG_PPC_VTB:
    *val = get_reg_val(id, vcpu->arch.vcore->vtb);

    \
     
     \ /
      Last update: 2019-10-10 10:58    [W:4.306 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site