summaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-6.1/950-0833-drivers-irqchip-irq-bcm2835-Concurrency-fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-6.1/950-0833-drivers-irqchip-irq-bcm2835-Concurrency-fix.patch')
-rw-r--r--target/linux/bcm27xx/patches-6.1/950-0833-drivers-irqchip-irq-bcm2835-Concurrency-fix.patch50
1 files changed, 0 insertions, 50 deletions
diff --git a/target/linux/bcm27xx/patches-6.1/950-0833-drivers-irqchip-irq-bcm2835-Concurrency-fix.patch b/target/linux/bcm27xx/patches-6.1/950-0833-drivers-irqchip-irq-bcm2835-Concurrency-fix.patch
deleted file mode 100644
index 48e2fcdc74..0000000000
--- a/target/linux/bcm27xx/patches-6.1/950-0833-drivers-irqchip-irq-bcm2835-Concurrency-fix.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From e804bd1843236a63815e9acfb1a38ebf9a28ef5b Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.com>
-Date: Thu, 31 Aug 2023 16:45:44 +0100
-Subject: [PATCH] drivers: irqchip: irq-bcm2835: Concurrency fix
-
-The commit shown in Fixes: aims to improve interrupt throughput by
-getting the handlers invoked on different CPU cores. It does so (*) by
-using an irq_ack hook to change the interrupt routing.
-
-Unfortunately, the IRQ status bits must be cleared at source, which only
-happens once the interrupt handler has run - there is no easy way for
-one core to claim one of the IRQs before sending the remainder to the
-next core on the list, so waking another core immediately results in a
-race with a chance of both cores handling the same IRQ. It is probably
-for this reason that the routing change is deferred to irq_ack, but that
-doesn't guarantee no clashes - after irq_ack is called, control returns
-to bcm2836_chained_handler_irq which proceeds to check for other pending
-IRQs at a time when the next core is probably doing the same thing.
-
-Since the whole point of the original commit is to distribute the IRQ
-handling, there is no reason to attempt to handle multiple IRQs in one
-interrupt callback, so the problem can be solved (or at least made much
-harder to reproduce) by changing a "while" into an "if", so that each
-invocation only handles one IRQ.
-
-(*) I'm not convinced it's as effective as claimed since irq_ack is
-called _after_ the interrupt handler, but the author thought it made a
-difference.
-
-See: https://github.com/raspberrypi/linux/issues/5214
- https://github.com/raspberrypi/linux/pull/1794
-
-Fixes: fd4c9785bde8 ("ARM64: Round-Robin dispatch IRQs between CPUs.")
-Signed-off-by: Phil Elwell <phil@raspberrypi.com>
----
- drivers/irqchip/irq-bcm2835.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/drivers/irqchip/irq-bcm2835.c
-+++ b/drivers/irqchip/irq-bcm2835.c
-@@ -343,7 +343,8 @@ static void bcm2836_chained_handle_irq(s
- {
- u32 hwirq;
-
-- while ((hwirq = get_next_armctrl_hwirq()) != ~0)
-+ hwirq = get_next_armctrl_hwirq();
-+ if (hwirq != ~0)
- generic_handle_domain_irq(intc.domain, hwirq);
- }
-