]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
genirq: Teach handle_simple_irq() to resend an in-progress interrupt
authorMarc Zyngier <maz@kernel.org>
Tue, 8 Jul 2025 17:33:52 +0000 (18:33 +0100)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 22 Jul 2025 20:33:00 +0000 (15:33 -0500)
It appears that the defect outlined in 9c15eeb5362c4 ("genirq: Allow
fasteoi handler to resend interrupts on concurrent handling") also
affects some other less stellar MSI controllers, this time using
the handle_simple_irq() flow.

Teach this flow about irqd_needs_resend_when_in_progress(). Given
the invasive nature of this workaround, only this flow is updated.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20250708173404.1278635-2-maz@kernel.org
kernel/irq/chip.c

index b0e0a7332993c77ab9c092f59c87b58c55552fc5..e3948e31e6540f16e1dbfc6559a82352d6c5690a 100644 (file)
@@ -551,7 +551,13 @@ void handle_simple_irq(struct irq_desc *desc)
 {
        guard(raw_spinlock)(&desc->lock);
 
-       if (!irq_can_handle(desc))
+       if (!irq_can_handle_pm(desc)) {
+               if (irqd_needs_resend_when_in_progress(&desc->irq_data))
+                       desc->istate |= IRQS_PENDING;
+               return;
+       }
+
+       if (!irq_can_handle_actions(desc))
                return;
 
        kstat_incr_irqs_this_cpu(desc);