Re: [PATCH] powerpc/entry: Use hard_irq_disable() in arch_interrupt_exit_prepare()
From: Shrikanth Hegde <hidden>
Date: 2026-08-19 10:53:00
Also in:
lkml
On 8/19/26 2:16 PM, Mukesh Kumar Chaurasiya wrote:
On Wed, Aug 19, 2026 at 11:24:40AM +0530, Venkat Rao Bagalkote wrote:quoted
[...]quoted
quoted
Hey Venkat, Can you try this diff,diff --git a/arch/powerpc/kernel/irq_64.c b/arch/powerpc/kernel/irq_64.c index d5c48d1b0a31..2fbfebef74fe 100644 --- a/arch/powerpc/kernel/irq_64.c +++ b/arch/powerpc/kernel/irq_64.c@@ -117,7 +117,7 @@ static __no_kcsan void __replay_soft_interrupts(void) local_paca->irq_happened |= PACA_IRQ_REPLAYING; ppc_save_regs(®s); - regs.softe = IRQS_ENABLED; + regs.softe = IRQS_DISABLED; regs.msr |= MSR_EE; /*Hello Mukesh, With the proposed change, I still the issue. [ 0.742633] ------------[ cut here ]------------ [ 0.742633] WARNING: arch/powerpc/kernel/irq_64.c:75 at __replay_soft_interrupts+0x104/0x220, CPU#6: swapper/0/1 [ 0.742637] Modules linked in: [ 0.742638] CPU: 6 UID: 0 PID: 1 Comm: swapper/0 Tainted: G W 7.2.0-rc7-dirty #25 PREEMPT [ 0.742639] Tainted: [W]=WARN [ 0.742640] Hardware name: IBM,9080-HEX Power11 (architected) 0x820200 0xf000007 of:IBM,FW1110.01 (NH1110_069) hv:phyp pSeries [ 0.742641] NIP: c00000000003a384 LR: c00000000003a360 CTR: c000000000029f00 [ 0.742642] REGS: c000000009757410 TRAP: 0700 Tainted: G W (7.2.0-rc7-dirty) [ 0.742643] MSR: 8000000002021033 <SF,VEC,ME,IR,DR,RI,LE> CR: 88024824 XER: 00000003 [ 0.742646] CFAR: c00000000002a708 IRQMASK: 1 [ 0.742646] GPR00: c00000000003a360 c0000000097576b0 c000000001b28100 c0000000097576d8 [ 0.742646] GPR04: 0000000000000000 0000000000000001 c00000000968d200 c0000000096eb200 [ 0.742646] GPR08: 0000000000000001 0000000000000041 0000000000000001 000000002c1b8100 [ 0.742646] GPR12: c000000000029f00 c0000005ffff8f00 0000000000000000 c00000000968d200 [ 0.742646] GPR16: c000000002f3aaf8 0000000000000000 c00000000284e138 0000000000000000 [ 0.742646] GPR20: c00000000303aaf8 c00000000303ade8 0000000000000001 0000000000000000 [ 0.742646] GPR24: c00000000303ae08 0000000000000000 0000000000000000 0000000000000002 [ 0.742646] GPR28: 0000000000000003 fcffffffffffffff fcffffffffffffff c00000000968d200 [ 0.742662] NIP [c00000000003a384] __replay_soft_interrupts+0x104/0x220 [ 0.742665] LR [c00000000003a360] __replay_soft_interrupts+0xe0/0x220 [ 0.742668] Call Trace: [ 0.742668] [c0000000097576b0] [c00000000003a360] __replay_soft_interrupts+0xe0/0x220 (unreliable) [ 0.742672] [c000000009757860] [c00000000003a694] arch_local_irq_restore+0x1f4/0x2d8 [ 0.742675] [c0000000097578b0] [c0000000002face0] console_flush_all+0x3ec/0x558 [ 0.742676] [c000000009757a00] [c0000000002faee4] console_unlock+0x98/0x1d8 [ 0.742678] [c000000009757a80] [c0000000002fc698] vprintk_emit+0x2c0/0x3f4 [ 0.742680] [c000000009757af0] [c0000000002fdc70] vprintk+0x30/0x7c [ 0.742682] [c000000009757b10] [c0000000002f6c78] _printk+0x3c/0x50 [ 0.742683] [c000000009757b30] [c00000000205d814] load_system_certificate_list+0x24/0x5c [ 0.742685] [c000000009757b90] [c00000000001111c] do_one_initcall+0x5c/0x3f0 [ 0.742687] [c000000009757c70] [c00000000200684c] do_initcalls+0x11c/0x270 [ 0.742689] [c000000009757d30] [c000000002006c78] kernel_init_freeable+0x228/0x3c0 [ 0.742690] [c000000009757de0] [c000000000011600] kernel_init+0x30/0x260 [ 0.742692] [c000000009757e50] [c00000000000df7c] ret_from_kernel_user_thread+0x14/0x1c Regards, Venkat.Hey Venkat, Thanks for verifying. The regs.softe = IRQS_DISABLED change only prevents irqentry_exit_cond_resched() preemption path from running — it does nothing about PACA_IRQ_HARD_DIS being cleared by the handler and not restored. hard_irq_disable() fixes both: it atomically sets PACA_IRQ_HARD_DIS, sets irq_soft_mask = IRQS_ALL_DISABLED, and clears MSR[EE], leaving a fully consistent disabled state that next_interrupt() expects, regardless of which entry path (idle wakeup or irqrestore) triggered the replay. To answer's shrikanth question it worked before because there was literally no interrupt-disabling code on the handler exit path during replay. The new GENERIC_ENTRY infrastructure brought a real exit sequence with it, and that sequence needs hard_irq_disable() — not local_irq_disable() — to keep PPC64's two-level interrupt state (irq_soft_mask + PACA_IRQ_HARD_DIS) consistent. Hey Madhavan, I think we are ok with this patch if there are no more objections from anyone.
Venkat, Can you collect vmcore with panic on warning enabled? It maybe nested replay of soft interrupts which maybe causing problems here. We should see the regs state.
Regards, Mukesh