diff options
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.patch | 44 |
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); + |