• Nicholas Piggin's avatar
    powerpc/64: Fix __check_irq_replay missing decrementer interrupt · 3db40c31
    Nicholas Piggin authored
    If the decrementer wraps again and de-asserts the decrementer
    exception while hard-disabled, __check_irq_replay() has a test to
    notice the wrap when interrupts are re-enabled.
    
    The decrementer check must be done when clearing the PACA_IRQ_HARD_DIS
    flag, not when the PACA_IRQ_DEC flag is tested. Previously this worked
    because the decrementer interrupt was always the first one checked
    after clearing the hard disable flag, but HMI check was moved ahead of
    that, which introduced this bug.
    
    This can cause a missed decrementer interrupt if we soft-disable
    interrupts then take an HMI which is recorded in irq_happened, then
    hard-disable interrupts for > 4s to wrap the decrementer.
    
    Fixes: e0e0d6b7 ("powerpc/64: Replay hypervisor maintenance interrupt first")
    Cc: stable@vger.kernel.org # v4.9+
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    3db40c31
irq.c 19 KB