RE: [PATCH v2 07/13] x86/irq: Factor out calling ISR from common_interrupt

From: Tian, Kevin
Date: Fri Apr 12 2024 - 05:24:29 EST


> 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().