Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [High] The use of irq_chip_retrigger_hierarchy() silently drops pending 
interrupts for root-level irq_chips (like lapic_controller) during CPU hotplug, 
because it intentionally bypasses the outermost chip.
--

commit 25a8009ce9e28c732ed15d13383d7819cd1539c8
Author: Naman Jain <[email protected]>

x86/irq: Use irq_chip_retrigger_hierarchy() in fixup_irqs()

This patch modifies fixup_irqs() to re-inject pending interrupts by walking
the interrupt hierarchy using irq_chip_retrigger_hierarchy(), rather than
relying solely on the outermost chip. It also introduces scoped guards for
the descriptor locks and conditionally sets VECTOR_RETRIGGERED only when
the retrigger operation succeeds.

> diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
> --- a/arch/x86/kernel/irq.c
> +++ b/arch/x86/kernel/irq.c
[ ... ]
> @@ -490,21 +490,19 @@ void fixup_irqs(void)
[ ... ]
>               if (is_vector_pending(vector)) {
> -                     desc = __this_cpu_read(vector_irq[vector]);
> -
> -                     raw_spin_lock(&desc->lock);
> +                     guard(raw_spinlock)(&desc->lock);
>                       data = irq_desc_get_irq_data(desc);
> -                     chip = irq_data_get_irq_chip(data);
> -                     if (chip->irq_retrigger) {
> -                             chip->irq_retrigger(data);
> +                     ret = irq_chip_retrigger_hierarchy(data);
> +                     if (ret)
>                               __this_cpu_write(vector_irq[vector], 
> VECTOR_RETRIGGERED);
> -                     }
> -                     raw_spin_unlock(&desc->lock);
>               }

[Severity: High]
Does this silently drop pending interrupts for root-level irq_chips like
lapic_controller?

Looking at irq_chip_retrigger_hierarchy(), it initializes its loop by
stepping immediately to the parent data:

kernel/irq/chip.c:irq_chip_retrigger_hierarchy() {
    for (data = data->parent_data; data; data = data->parent_data)
        if (data->chip && data->chip->irq_retrigger)
            return data->chip->irq_retrigger(data);

    return 0;
}

If the interrupt relies on a non-hierarchical root domain where parent_data
is NULL, this loop will immediately exit and return 0. The valid
irq_retrigger callback on the outermost leaf chip is never executed.

Could this lead to lost hardware interrupts (such as legacy timer or ISA
interrupts) during CPU hot-unplug for these devices?

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=2

Reply via email to