summaryrefslogtreecommitdiffstats
path: root/target/linux/ramips/patches-3.10/0201-MIPS-GIC-Fix-gic_set_affinity-infinite-loop.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ramips/patches-3.10/0201-MIPS-GIC-Fix-gic_set_affinity-infinite-loop.patch')
-rw-r--r--target/linux/ramips/patches-3.10/0201-MIPS-GIC-Fix-gic_set_affinity-infinite-loop.patch44
1 files changed, 44 insertions, 0 deletions
diff --git a/target/linux/ramips/patches-3.10/0201-MIPS-GIC-Fix-gic_set_affinity-infinite-loop.patch b/target/linux/ramips/patches-3.10/0201-MIPS-GIC-Fix-gic_set_affinity-infinite-loop.patch
new file mode 100644
index 0000000000..f1898ba073
--- /dev/null
+++ b/target/linux/ramips/patches-3.10/0201-MIPS-GIC-Fix-gic_set_affinity-infinite-loop.patch
@@ -0,0 +1,44 @@
+From cde59bef2f155fc38413e470ff0e4672623cdbec Mon Sep 17 00:00:00 2001
+From: Tony Wu <tung7970@gmail.com>
+Date: Fri, 21 Jun 2013 10:13:08 +0000
+Subject: [PATCH 201/215] MIPS: GIC: Fix gic_set_affinity infinite loop
+
+There is an infinite loop in gic_set_affinity. When irq_set_affinity
+gets called on gic controller, it blocks forever.
+
+Signed-off-by: Tony Wu <tung7970@gmail.com>
+Cc: Steven J. Hill <Steven.Hill@imgtec.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/5537/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+(cherry picked from commit c214c03512b67e56dea3f4471705f8caae49553a)
+---
+ arch/mips/kernel/irq-gic.c | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+--- a/arch/mips/kernel/irq-gic.c
++++ b/arch/mips/kernel/irq-gic.c
+@@ -219,16 +219,15 @@ static int gic_set_affinity(struct irq_d
+
+ /* Assumption : cpumask refers to a single CPU */
+ spin_lock_irqsave(&gic_lock, flags);
+- for (;;) {
+- /* Re-route this IRQ */
+- GIC_SH_MAP_TO_VPE_SMASK(irq, first_cpu(tmp));
+
+- /* Update the pcpu_masks */
+- for (i = 0; i < NR_CPUS; i++)
+- clear_bit(irq, pcpu_masks[i].pcpu_mask);
+- set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask);
++ /* Re-route this IRQ */
++ GIC_SH_MAP_TO_VPE_SMASK(irq, first_cpu(tmp));
++
++ /* Update the pcpu_masks */
++ for (i = 0; i < NR_CPUS; i++)
++ clear_bit(irq, pcpu_masks[i].pcpu_mask);
++ set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask);
+
+- }
+ cpumask_copy(d->affinity, cpumask);
+ spin_unlock_irqrestore(&gic_lock, flags);
+