> From: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> > Sent: Saturday, April 6, 2024 6:31 AM > > Prepare for calling external IRQ handlers directly from the posted MSI > demultiplexing loop. Extract the common code with common interrupt to > avoid code duplication. > > Signed-off-by: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> > --- > arch/x86/kernel/irq.c | 23 ++++++++++++++--------- > 1 file changed, 14 insertions(+), 9 deletions(-) > > diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c > index f39f6147104c..c54de9378943 100644 > --- a/arch/x86/kernel/irq.c > +++ b/arch/x86/kernel/irq.c > @@ -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); the hidden lines has one problem: } else { apic_eoi(); if (desc == VECTOR_UNUSED) { ... there will be two EOI's for unused vectors, adding the one in sysvec_posted_msi_notification().