• Suraj Jitindar Singh's avatar
    KVM: PPC: Book3S HV: Clear pending decrementer exceptions on nested guest entry · 3c25ab35
    Suraj Jitindar Singh authored
    If we enter an L1 guest with a pending decrementer exception then this
    is cleared on guest exit if the guest has writtien a positive value
    into the decrementer (indicating that it handled the decrementer
    exception) since there is no other way to detect that the guest has
    handled the pending exception and that it should be dequeued. In the
    event that the L1 guest tries to run a nested (L2) guest immediately
    after this and the L2 guest decrementer is negative (which is loaded
    by L1 before making the H_ENTER_NESTED hcall), then the pending
    decrementer exception isn't cleared and the L2 entry is blocked since
    L1 has a pending exception, even though L1 may have already handled
    the exception and written a positive value for it's decrementer. This
    results in a loop of L1 trying to enter the L2 guest and L0 blocking
    the entry since L1 has an interrupt pending with the outcome being
    that L2 never gets to run and hangs.
    
    Fix this by clearing any pending decrementer exceptions when L1 makes
    the H_ENTER_NESTED hcall since it won't do this if it's decrementer
    has gone negative, and anyway it's decrementer has been communicated
    to L0 in the hdec_expires field and L0 will return control to L1 when
    this goes negative by delivering an H_DECREMENTER exception.
    
    Fixes: 95a6432c ("KVM: PPC: Book3S HV: Streamlined guest entry/exit path on P9 for radix guests")
    Cc: stable@vger.kernel.org # v4.20+
    Signed-off-by: default avatarSuraj Jitindar Singh <sjitindarsingh@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    3c25ab35
book3s_hv.c 143 KB