[PATCHv2 3/5] kernel/irq: make irq_{enter,exit}() in handle_domain_irq() arch optional

From: Pingfan Liu
Date: Fri Sep 24 2021 - 09:33:13 EST


handle_domain_irq() contains two major parts:
-1. irq_enter()/irq_exit(), which serves as hooks for rcu and trace etc.
-2. irq mapping and dispatching

After the introduction of irqentry_enter()/irqentry_exit() and arch
specific counterpart (e.g. arm64), roughly speaking, rcu_irq_enter() has
already been called. Hence here comes requirement to move
irq_enter/irq_exit out of handle_domain_irq(). And arches should handle
about irq_enter_rcu()/irq_exit_rcu() by themself.

Since there is still arches, which does not adopt irqentry_enter(), let
irq_enter()/irq_exit() arch optional in handle_domain_irq().

Signed-off-by: Pingfan Liu <kernelfans@xxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Catalin Marinas <catalin.marinas@xxxxxxx>
Cc: Will Deacon <will@xxxxxxxxxx>
Cc: Mark Rutland <mark.rutland@xxxxxxx>
Cc: Marc Zyngier <maz@xxxxxxxxxx>
Cc: Joey Gouly <joey.gouly@xxxxxxx>
Cc: Sami Tolvanen <samitolvanen@xxxxxxxxxx>
Cc: Julien Thierry <julien.thierry@xxxxxxx>
Cc: Yuichi Ito <ito-yuichi@xxxxxxxxxxx>
Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
To: linux-kernel@xxxxxxxxxxxxxxx
---
kernel/irq/Kconfig | 3 +++
kernel/irq/irqdesc.c | 4 ++++
2 files changed, 7 insertions(+)

diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig
index fbc54c2a7f23..defa1db2d664 100644
--- a/kernel/irq/Kconfig
+++ b/kernel/irq/Kconfig
@@ -100,6 +100,9 @@ config IRQ_MSI_IOMMU
config HANDLE_DOMAIN_IRQ
bool

+config HAVE_ARCH_IRQENTRY
+ bool
+
config IRQ_TIMINGS
bool

diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c
index 4e3c29bb603c..fd5dd9d278b5 100644
--- a/kernel/irq/irqdesc.c
+++ b/kernel/irq/irqdesc.c
@@ -693,7 +693,9 @@ int handle_domain_irq(struct irq_domain *domain,
struct irq_desc *desc;
int ret = 0;

+#ifndef CONFIG_HAVE_ARCH_IRQENTRY
irq_enter();
+#endif

/* The irqdomain code provides boundary checks */
desc = irq_resolve_mapping(domain, hwirq);
@@ -702,7 +704,9 @@ int handle_domain_irq(struct irq_domain *domain,
else
ret = -EINVAL;

+#ifndef CONFIG_HAVE_ARCH_IRQENTRY
irq_exit();
+#endif
set_irq_regs(old_regs);
return ret;
}
--
2.31.1