From: Nicholas Piggin Date: Sat, 21 Jan 2023 09:53:52 +0000 (+1000) Subject: powerpc/64s: Fix local irq disable when PMIs are disabled X-Git-Tag: baikal/aarch64/sdk6.1~12 X-Git-Url: https://git.baikalelectronics.ru/sdk/?a=commitdiff_plain;h=527470d9ada8420aa66d97b69bbf0af458cabf2f;p=kernel.git powerpc/64s: Fix local irq disable when PMIs are disabled commit bc88ef663265676419555df2dc469a471c0add31 upstream. When PMI interrupts are soft-masked, local_irq_save() will clear the PMI mask bit, allowing PMIs in and causing a race condition. This causes a deadlock in native_hpte_insert via hash_preload, which depends on PMIs being disabled since commit 8b78f67e0a6b ("powerpc/64s/hash: Make hash faults work in NMI context"). native_hpte_insert calls local_irq_save(). It's possible the lpar hash code is also affected when tracing is enabled because __trace_hcall_entry() calls local_irq_save(). Fix this by making arch_local_irq_save() _or_ the IRQS_DISABLED bit into the mask. This was found with the stress_hpt option with a kbuild workload running together with `perf record -g`. Fixes: 384f14ea5b2c ("powerpc/64s: Add support to mask perf interrupts and replay them") Fixes: 8b78f67e0a6b ("powerpc/64s/hash: Make hash faults work in NMI context") Signed-off-by: Nicholas Piggin [mpe: Just take the fix without the new warning] Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20230121095352.2823517-1-npiggin@gmail.com Signed-off-by: Greg Kroah-Hartman --- diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index 77fa88c2aed0d..0b7d01d408ac8 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h @@ -192,7 +192,7 @@ static inline void arch_local_irq_enable(void) static inline unsigned long arch_local_irq_save(void) { - return irq_soft_mask_set_return(IRQS_DISABLED); + return irq_soft_mask_or_return(IRQS_DISABLED); } static inline bool arch_irqs_disabled_flags(unsigned long flags)