• Gautham R. Shenoy's avatar
    KVM: PPC: Book3S HV: Handle H_DOORBELL on the guest exit path · 70aa3961
    Gautham R. Shenoy authored
    Currently a CPU running a guest can receive a H_DOORBELL in the
    following two cases:
    1) When the CPU is napping due to CEDE or there not being a guest
    vcpu.
    2) The CPU is running the guest vcpu.
    
    Case 1), the doorbell message is not cleared since we were waking up
    from nap. Hence when the EE bit gets set on transition from guest to
    host, the H_DOORBELL interrupt is delivered to the host and the
    corresponding handler is invoked.
    
    However in Case 2), the message gets cleared by the action of taking
    the H_DOORBELL interrupt. Since the CPU was running a guest, instead
    of invoking the doorbell handler, the code invokes the second-level
    interrupt handler to switch the context from the guest to the host. At
    this point the setting of the EE bit doesn't result in the CPU getting
    the doorbell interrupt since it has already been delivered once. So,
    the handler for this doorbell is never invoked!
    
    This causes softlockups if the missed DOORBELL was an IPI sent from a
    sibling subcore on the same CPU.
    
    This patch fixes it by explitly invoking the doorbell handler on the
    exit path if the exit reason is H_DOORBELL similar to the way an
    EXTERNAL interrupt is handled. Since this will also handle Case 1), we
    can unconditionally clear the doorbell message in
    kvmppc_check_wake_reason.
    Signed-off-by: default avatarGautham R. Shenoy <ego@linux.vnet.ibm.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    70aa3961
book3s_hv_rmhandlers.S 63.6 KB