Excerpts from Michael Ellerman's message of February 2, 2021 8:31 pm: > Nicholas Piggin <npig...@gmail.com> writes: >> There is no need for this to be in asm, use the new intrrupt entry wrapper. >> >> Signed-off-by: Nicholas Piggin <npig...@gmail.com> >> --- >> arch/powerpc/include/asm/interrupt.h | 15 +++++++++ >> arch/powerpc/include/asm/processor.h | 1 + >> arch/powerpc/include/asm/thread_info.h | 6 ++++ >> arch/powerpc/kernel/exceptions-64s.S | 45 -------------------------- >> arch/powerpc/kernel/idle_book3s.S | 4 +++ >> 5 files changed, 26 insertions(+), 45 deletions(-) > > Something in here is making my G5 not boot. > > I don't know what the problem is because that machine is in the office, > and I am not, and it has no serial console. > > I tried turning on pstore but it doesn't record anything :/
Here is an incremental patch (hopefully) should fix it. Should be folded with this one. Thanks, Nick --- powerpc/64s: nap_adjust_return fix This is a fix for patch "powerpc/64s: power4 nap fixup in C". Non-maskable interrupts should not create any exit work, so there should be no reason to come out of idle. So take the nap fixup out of NMIs. The problem with having them here is that an interrupt can come in and then get interrupted by an NMI, the NMI will then set its return to the idle wakeup and never complete the regular interrupt handling. Before the "powerpc/64s: power4 nap fixup in C" patch, this wouldn't occur because the true NMIs didn't call FIXUP_NAP, and the other interrupts would call it before running their handler, so they would not have a chance to call may_hard_irq_enable and allow soft-NMIs (watchdog, perf) to come through. Signed-off-by: Nicholas Piggin <npig...@gmail.com> --- arch/powerpc/include/asm/interrupt.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h index 25f2420b1965..afdf4aba2e6b 100644 --- a/arch/powerpc/include/asm/interrupt.h +++ b/arch/powerpc/include/asm/interrupt.h @@ -12,6 +12,7 @@ static inline void nap_adjust_return(struct pt_regs *regs) { #ifdef CONFIG_PPC_970_NAP if (unlikely(test_thread_local_flags(_TLF_NAPPING))) { + /* Can avoid a test-and-clear because NMIs do not call this */ clear_thread_local_flags(_TLF_NAPPING); regs->nip = (unsigned long)power4_idle_nap_return; } @@ -164,7 +165,10 @@ static inline void interrupt_nmi_exit_prepare(struct pt_regs *regs, struct inter radix_enabled() || (mfmsr() & MSR_DR)) nmi_exit(); - nap_adjust_return(regs); + /* + * nmi does not call nap_adjust_return because nmi should not create + * new work to do (must use irq_work for that). + */ #ifdef CONFIG_PPC64 if (TRAP(regs) != 0x900 && TRAP(regs) != 0xf00 && TRAP(regs) != 0x260) -- 2.23.0