powerpc/irq: Don't WARN continuously in arch_local_irq_restore()
When CONFIG_PPC_IRQ_SOFT_MASK_DEBUG is enabled (uncommon), we have a series of WARN_ON's in arch_local_irq_restore(). These are "should never happen" conditions, but if they do happen they can flood the console and render the system unusable. So switch them to WARN_ON_ONCE(). Fixes:e2b36d5917("powerpc/64: Don't trace code that runs with the soft irq mask unreconciled") Fixes:9b81c0211c("powerpc/64s: make PACA_IRQ_HARD_DIS track MSR[EE] closely") Fixes:7c0482e3d0("powerpc/irq: Fix another case of lazy IRQ state getting out of sync") Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20190708061046.7075-1-mpe@ellerman.id.au
This commit is contained in:
@@ -259,7 +259,7 @@ notrace void arch_local_irq_restore(unsigned long mask)
|
|||||||
irq_happened = get_irq_happened();
|
irq_happened = get_irq_happened();
|
||||||
if (!irq_happened) {
|
if (!irq_happened) {
|
||||||
#ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG
|
#ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG
|
||||||
WARN_ON(!(mfmsr() & MSR_EE));
|
WARN_ON_ONCE(!(mfmsr() & MSR_EE));
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -272,7 +272,7 @@ notrace void arch_local_irq_restore(unsigned long mask)
|
|||||||
*/
|
*/
|
||||||
if (!(irq_happened & PACA_IRQ_HARD_DIS)) {
|
if (!(irq_happened & PACA_IRQ_HARD_DIS)) {
|
||||||
#ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG
|
#ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG
|
||||||
WARN_ON(!(mfmsr() & MSR_EE));
|
WARN_ON_ONCE(!(mfmsr() & MSR_EE));
|
||||||
#endif
|
#endif
|
||||||
__hard_irq_disable();
|
__hard_irq_disable();
|
||||||
#ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG
|
#ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG
|
||||||
@@ -283,7 +283,7 @@ notrace void arch_local_irq_restore(unsigned long mask)
|
|||||||
* warn if we are wrong. Only do that when IRQ tracing
|
* warn if we are wrong. Only do that when IRQ tracing
|
||||||
* is enabled as mfmsr() can be costly.
|
* is enabled as mfmsr() can be costly.
|
||||||
*/
|
*/
|
||||||
if (WARN_ON(mfmsr() & MSR_EE))
|
if (WARN_ON_ONCE(mfmsr() & MSR_EE))
|
||||||
__hard_irq_disable();
|
__hard_irq_disable();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user