Add a flavour of interrupt disable which could be used in multiple places which also takes care of lockdep in both 32 and 64 bit archs.
On PPC64: - Disable hard interrupts using hard_irq_disable. It takes care of lockdep and tracing. local_irq_disable only alters softmask's state. On PPC32: - Interrupts are hard disabled with local_irq_disable. It also takes care of lockdep and tacing. Subsequent patch uses this API in KVM code to avoid the warnings. Wider use of it is possible, but it will be taken subsequently. Suggested-by: Ritesh Harjani (IBM) <[email protected]> Signed-off-by: Shrikanth Hegde <[email protected]> --- arch/powerpc/include/asm/hw_irq.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index b7eee6385ae5..075442366e1e 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h @@ -516,6 +516,23 @@ static inline unsigned long mtmsr_isync_irqsafe(unsigned long msr) #define ARCH_IRQ_INIT_FLAGS IRQ_NOREQUEST +/* + * Hard-disable interrupts while keeping the IRQ tracing state + * consistent. + * + * On PPC64, local_irq_disable() only soft-disables interrupts, leaving + * a window where an interrupt can be recorded in irq_happened before + * interrupts are hard-disabled. + * + * On PPC32, hard_irq_disable() does not update the IRQ tracing state, so + * use local_irq_disable(). + */ +#ifdef CONFIG_PPC64 +#define ppc_hard_irq_disable() hard_irq_disable() +#else +#define ppc_hard_irq_disable() local_irq_disable() +#endif + #endif /* __ASSEMBLER__ */ #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_HW_IRQ_H */ -- 2.52.0
