Re: [PATCH] powerpc/entry: Use hard_irq_disable() in arch_interrupt_exit_prepare()

"Christophe Leroy (CS GROUP)" <[email protected]>
Newsgroups org.ozlabs.lists.linuxppc-dev,org.kernel.vger.linux-kernel
Message-ID <[email protected]>

Le 13/08/2026 à 08:36, Venkat Rao Bagalkote a écrit :
> 
> On 12/08/26 8:50 pm, Mukesh Kumar Chaurasiya (IBM) wrote:
>> commit 334f3f6d7a16 ("powerpc/entry: Disable interrupts before 
>> irqentry_exit")
>> fixed a BUG in preempt_schedule_irq() by calling local_irq_disable()
>> unconditionally in arch_interrupt_exit_prepare() before irqentry_exit().
>> The fix is correct in intent but uses the wrong primitive for PPC64.
>>
>> On PPC64, local_irq_disable() only sets the soft-mask
>> (irq_soft_mask = IRQS_DISABLED). It does not set PACA_IRQ_HARD_DIS in
>> irq_happened and does not clear MSR[EE].
>>
>> This causes a continuous WARN_ON boot hang on Power11 pSeries LPARs
>> using the dedicated-cede cpuidle path. When the CPU wakes from H_CEDE,
>> interrupt_exit_kernel_prepare() calls replay_soft_interrupts(), which
>> dispatches pending async handlers (timer_interrupt, do_IRQ) using the
>> DEFINE_INTERRUPT_HANDLER_ASYNC macro. That macro calls
>> arch_interrupt_async_exit_prepare() -> arch_interrupt_exit_prepare()
>> before irqentry_exit(). With local_irq_disable(), PACA_IRQ_HARD_DIS
>> is not set, but next_interrupt() unconditionally asserts it:
>>
>>    WARN_ON(!(local_paca->irq_happened & PACA_IRQ_HARD_DIS));
>>
>> This fires on every replayed interrupt, looping indefinitely and
>> preventing boot completion.
>>
>> Fix this by replacing local_irq_disable() with hard_irq_disable().
>> On PPC64, hard_irq_disable() sets irq_soft_mask to IRQS_ALL_DISABLED,
>> sets PACA_IRQ_HARD_DIS in irq_happened, and clears MSR[EE] — satisfying
>> all of:
>>
>>    - lockdep_assert_irqs_disabled() in irqentry_exit_to_kernel_mode()
>>    - next_interrupt()'s WARN_ON(!(irq_happened & PACA_IRQ_HARD_DIS))
>>    - preempt_schedule_irq()'s BUG_ON(!irqs_disabled())
>>
>> On PPC32/non-64, hard_irq_disable() is equivalent to local_irq_disable(),
>> so there is no regression on those platforms.
>>
>> Fixes: 334f3f6d7a16 ("powerpc/entry: Disable interrupts before 
>> irqentry_exit")
>> Reported-by: Venkat Rao Bagalkote <[email protected]>
>> Closes: https://eur01.safelinks.protection.outlook.com/? 
>> url=https%3A%2F%2Flore.kernel.org%2Fall%2F6f9bfb0f-b14c-468e-bb9f- 
>> c157d120d0dc%40linux.ibm.com%2F&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7Cf780f6a2abcf425c875808def90533e4%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C639221997929524168%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=kOer%2B610LkQs0ZKBn%2FutIB6j1bMoFasK4DmX4AEWOXA%3D&reserved=0
>> Signed-off-by: Mukesh Kumar Chaurasiya (IBM) <[email protected]>
>> ---
> 
> 
> Tested this, and it fixes the reported issue.
> 
> Tested-by: Venkat Rao Bagalkote <[email protected]>

Didn't you say yesterday [1] that the change doesn't fix the issue ? Did 
I miss something ?

[1] 
https://lore.kernel.org/all/[email protected]/


> 
> 
> Regards,
> 
> Venkat.
> 
> 
>>   arch/powerpc/include/asm/entry-common.h | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/powerpc/include/asm/entry-common.h b/arch/powerpc/ 
>> include/asm/entry-common.h
>> index c5adb5006361..de64389b0815 100644
>> --- a/arch/powerpc/include/asm/entry-common.h
>> +++ b/arch/powerpc/include/asm/entry-common.h
>> @@ -270,7 +270,7 @@ static inline void 
>> arch_interrupt_exit_prepare(struct pt_regs *regs)
>>       }
>>       /* irqentry_exit expects to be called with interrupts disabled */
>> -    local_irq_disable();
>> +    hard_irq_disable();
>>   }
>>   static inline void arch_interrupt_async_enter_prepare(struct pt_regs 
>> *regs)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.