openwrtv3/target/linux/generic/pending-4.4/091-MIPS-c-r4k-Exclude-sibling-CPUs-in-SMP-calls.patch
John Crispin 74d00a8c38 kernel: split patches folder up into backport, pending and hack folders
* properly format/comment all patches
* merge debloat patches
* merge Kconfig patches
* merge swconfig patches
* merge hotplug patches
* drop 200-fix_localversion.patch - upstream
* drop 222-arm_zimage_none.patch - unused
* drop 252-mv_cesa_depends.patch - no longer required
* drop 410-mtd-move-forward-declaration-of-struct-mtd_info.patch - unused
* drop 661-fq_codel_keep_dropped_stats.patch - outdated
* drop 702-phy_add_aneg_done_function.patch - upstream
* drop 840-rtc7301.patch - unused
* drop 841-rtc_pt7c4338.patch - upstream
* drop 921-use_preinit_as_init.patch - unused
* drop spio-gpio-old and gpio-mmc - unused

Signed-off-by: John Crispin <john@phrozen.org>
2017-08-05 08:46:36 +02:00

37 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();
}