powerpc/64: Fix __check_irq_replay missing decrementer interrupt
commit03ebdd1eb95afc3d4524540ecb1226567e655e5e
authorNicholas Piggin <npiggin@gmail.com>
Tue, 1 Aug 2017 13:59:28 +0000 (1 23:59 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Aug 2017 15:49:30 +0000 (11 08:49 -0700)
treeff7d94c981c341aa130897d0d4acd13d87e865ea
parent8164692a2f66ecc08bcdc42955b6ce62d47637ec
powerpc/64: Fix __check_irq_replay missing decrementer interrupt

commit 3db40c312c2c1eb2187c5731102fa8ff380e6e40 upstream.

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: e0e0d6b7390b ("powerpc/64: Replay hypervisor maintenance interrupt first")
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/kernel/irq.c