diff options
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.patch | 50 |
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); - } - |