summaryrefslogtreecommitdiff
path: root/kernel/irq/chip.c
diff options
context:
space:
mode:
authorMarc Zyngier <maz@kernel.org>2025-07-08 18:33:52 +0100
committerBjorn Helgaas <bhelgaas@google.com>2025-07-22 15:33:00 -0500
commit2c9e7f857400ffecf16c49bc6d98ac43d4129fef (patch)
treea8dfc009d3f19163e2c85bdabd99654be9e8e0ce /kernel/irq/chip.c
parent19272b37aa4f83ca52bdf9c16d5d81bdd1354494 (diff)
genirq: Teach handle_simple_irq() to resend an in-progress interrupt
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
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r--kernel/irq/chip.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index b0e0a7332993..e3948e31e654 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -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);