[PATCH 36/38] genirq: Trust local irqchip when considering IRQ for NMI

Vladimir Murzin vladimir.murzin at arm.com
Mon Sep 14 03:21:00 PDT 2026


Generic IRQ code sanitises whether an IRQ can be considered for NMI
use. Currently, it only considers IRQs managed by the root irqchip.

GICv5 IPIs belong to a logical domain built on top of the LPI domain.
Consequently, generic IRQ code rejects these IPIs for NMI use, even
though their hardware state is managed by the root LPI domain.

One way to allow GICv5 IPIs to be used as NMIs would be to adjust the
sanitisation logic to account for this domain hierarchy. However, the
generic IRQ code can instead trust the local irqchip.

Remove the root irqchip check and use the local irqchip when
considering an IRQ for NMI use.

Suggested-by: Marc Zyngier <maz at kernel.org>
Signed-off-by: Vladimir Murzin <vladimir.murzin at arm.com>
---
 include/linux/irq.h | 2 +-
 kernel/irq/manage.c | 5 -----
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/include/linux/irq.h b/include/linux/irq.h
index f485369b1b4f..92d3ad639ae8 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -563,7 +563,7 @@ struct irq_chip {
  * IRQCHIP_ONESHOT_SAFE:              One shot does not require mask/unmask
  * IRQCHIP_EOI_THREADED:              Chip requires eoi() on unmask in threaded mode
  * IRQCHIP_SUPPORTS_LEVEL_MSI:        Chip can provide two doorbells for Level MSIs
- * IRQCHIP_SUPPORTS_NMI:              Chip can deliver NMIs, only for root irqchips
+ * IRQCHIP_SUPPORTS_NMI:              Chip can deliver NMIs
  * IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND:  Invokes __enable_irq()/__disable_irq() for wake irqs
  *                                    in the suspend path if they are in disabled state
  * IRQCHIP_AFFINITY_PRE_STARTUP:      Default affinity update before startup
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 57eff26fa646..c9ad79743ef6 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1370,11 +1370,6 @@ static bool irq_supports_nmi(struct irq_desc *desc)
 {
 	struct irq_data *d = irq_desc_get_irq_data(desc);
 
-#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
-	/* Only IRQs directly managed by the root irqchip can be set as NMI */
-	if (d->parent_data)
-		return false;
-#endif
 	/* Don't support NMIs for chips behind a slow bus */
 	if (d->chip->irq_bus_lock || d->chip->irq_bus_sync_unlock)
 		return false;
-- 
2.34.1




More information about the linux-arm-kernel mailing list