]> Git Repo - J-linux.git/commitdiff
x86/irq: Factor out handler invocation from common_interrupt()
authorJacob Pan <[email protected]>
Tue, 23 Apr 2024 17:41:09 +0000 (10:41 -0700)
committerThomas Gleixner <[email protected]>
Mon, 29 Apr 2024 22:54:42 +0000 (00:54 +0200)
Prepare for calling external interrupt handlers directly from the posted
MSI demultiplexing loop. Extract the common code from common_interrupt() to
avoid code duplication.

Signed-off-by: Jacob Pan <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
arch/x86/kernel/irq.c

index dbb3a19b3004da344baac744a1cec4cef492f3ff..d652b0481899605b29426d948ee19039d395d656 100644 (file)
@@ -242,18 +242,10 @@ static __always_inline void handle_irq(struct irq_desc *desc,
                __handle_irq(desc, regs);
 }
 
-/*
- * common_interrupt() handles all normal device IRQ's (the special SMP
- * cross-CPU interrupts have their own entry points).
- */
-DEFINE_IDTENTRY_IRQ(common_interrupt)
+static __always_inline void call_irq_handler(int vector, struct pt_regs *regs)
 {
-       struct pt_regs *old_regs = set_irq_regs(regs);
        struct irq_desc *desc;
 
-       /* entry code tells RCU that we're not quiescent.  Check it. */
-       RCU_LOCKDEP_WARN(!rcu_is_watching(), "IRQ failed to wake up RCU");
-
        desc = __this_cpu_read(vector_irq[vector]);
        if (likely(!IS_ERR_OR_NULL(desc))) {
                handle_irq(desc, regs);
@@ -268,7 +260,20 @@ DEFINE_IDTENTRY_IRQ(common_interrupt)
                        __this_cpu_write(vector_irq[vector], VECTOR_UNUSED);
                }
        }
+}
+
+/*
+ * common_interrupt() handles all normal device IRQ's (the special SMP
+ * cross-CPU interrupts have their own entry points).
+ */
+DEFINE_IDTENTRY_IRQ(common_interrupt)
+{
+       struct pt_regs *old_regs = set_irq_regs(regs);
+
+       /* entry code tells RCU that we're not quiescent.  Check it. */
+       RCU_LOCKDEP_WARN(!rcu_is_watching(), "IRQ failed to wake up RCU");
 
+       call_irq_handler(vector, regs);
        set_irq_regs(old_regs);
 }
 
This page took 0.051738 seconds and 4 git commands to generate.