powerpc/64s/interrupt: Perf NMI should not take normal exit path
authorNicholas Piggin <npiggin@gmail.com>
Thu, 6 Oct 2022 14:04:11 +0000 (00:04 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 18 Oct 2022 11:46:19 +0000 (22:46 +1100)
commitdc398a084d459f065658855454e09f2778f8c5cc
treedba45be1f6d86775998339cbebcdc038f931a203
parenta073672eb09670540e95a2a4aa1c46f5da74159f
powerpc/64s/interrupt: Perf NMI should not take normal exit path

NMI interrupts should exit with EXCEPTION_RESTORE_REGS not with
interrupt_return_srr, which is what the perf NMI handler currently does.
This breaks if a PMI hits after interrupt_exit_user_prepare_main() has
switched the context tracking to user mode, then the CT_WARN_ON() in
interrupt_exit_kernel_prepare() fires because it returns to kernel with
context set to user.

This could possibly be solved by soft-disabling PMIs in the exit path,
but that reduces our ability to profile that code. The warning could be
removed, but it's potentially useful.

All other NMIs and soft-NMIs return using EXCEPTION_RESTORE_REGS, so
this makes perf interrupts consistent with that and seems like the best
fix.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
[mpe: Squash in fixups from Nick]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221006140413.126443-3-npiggin@gmail.com
arch/powerpc/kernel/exceptions-64s.S
arch/powerpc/kernel/interrupt.c