You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openwrt/target/linux/generic/pending-4.4/091-MIPS-c-r4k-Exclude-sibl...

38 lines
1.2 KiB
Diff

From: James Hogan <james.hogan@imgtec.com>
Date: Thu, 3 Mar 2016 21:30:42 +0000
Subject: [PATCH] MIPS: c-r4k: Exclude sibling CPUs in SMP calls
When performing SMP calls to foreign cores, exclude sibling CPUs from
the provided map, as we already handle the local core on the current
CPU. This prevents an IPI call from for example core 0, VPE 1 to VPE 0
on the same core.
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
---
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -96,8 +96,17 @@ static inline void r4k_on_each_cpu(unsig
void (*func) (void *info), void *info)
{
preempt_disable();
- if (r4k_op_needs_ipi(type))
- smp_call_function_many(&cpu_foreign_map, func, info, 1);
+ /* cpu_foreign_map and cpu_sibling_map[] undeclared when !CONFIG_SMP */
+#ifdef CONFIG_SMP
+ if (r4k_op_needs_ipi(type)) {
+ struct cpumask mask;
+
+ /* exclude sibling CPUs */
+ cpumask_andnot(&mask, &cpu_foreign_map,
+ &cpu_sibling_map[smp_processor_id()]);
+ smp_call_function_many(&mask, func, info, 1);
+ }
+#endif
func(info);
preempt_enable();
}