public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] MIPS: c-r4k: remove cpu_foreign_map
@ 2015-08-03 15:54 Paul Burton
  2015-08-03 16:18 ` Ralf Baechle
  0 siblings, 1 reply; 2+ messages in thread
From: Paul Burton @ 2015-08-03 15:54 UTC (permalink / raw)
  To: linux-mips
  Cc: Paul Burton, Rusty Russell, Joshua Kinard, Andrew Bresticker,
	Huacai Chen, Paul Gortmaker, Kevin Cernekee, linux-kernel,
	Maciej W. Rozycki, Markos Chandras, Ralf Baechle, Alex Smith

Commit cccf34e9411c ("MIPS: c-r4k: Fix cache flushing for MT cores") did
2 things:

  - Introduced cpu_foreign_map to call cache maintenance functions on
    only a single CPU within each core in the system.

  - Stopped calling cache maintenance functions on non-local CPUs for
    systems which include a MIPS Coherence Manager.

Thus the introduction of cpu_foreign_map has no effect on any systems
with a CM, since the IPIs will be avoided entirely. Thus it can only
possibly affect other systems which have multiple logical CPUs per core,
which appears to only be netlogic. I'm pretty certain this wasn't the
intent, am unsure whether avoiding such cache maintenance calls is
correct for netlogic systems and believe the overhead of calculating
cpu_foreign_map is thus unnecessary & this code is almost certainly
untested.

This mostly reverts commit cccf34e9411c ("MIPS: c-r4k: Fix cache
flushing for MT cores"), leaving only the change for systems with a CM.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
---

 arch/mips/include/asm/smp.h |  1 -
 arch/mips/kernel/smp.c      | 44 +-------------------------------------------
 arch/mips/mm/c-r4k.c        |  2 +-
 3 files changed, 2 insertions(+), 45 deletions(-)

diff --git a/arch/mips/include/asm/smp.h b/arch/mips/include/asm/smp.h
index 03722d4..a036e1f 100644
--- a/arch/mips/include/asm/smp.h
+++ b/arch/mips/include/asm/smp.h
@@ -23,7 +23,6 @@
 extern int smp_num_siblings;
 extern cpumask_t cpu_sibling_map[];
 extern cpumask_t cpu_core_map[];
-extern cpumask_t cpu_foreign_map;
 
 #define raw_smp_processor_id() (current_thread_info()->cpu)
 
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
index a31896c..184876b 100644
--- a/arch/mips/kernel/smp.c
+++ b/arch/mips/kernel/smp.c
@@ -63,13 +63,6 @@ EXPORT_SYMBOL(cpu_sibling_map);
 cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
 EXPORT_SYMBOL(cpu_core_map);
 
-/*
- * A logcal cpu mask containing only one VPE per core to
- * reduce the number of IPIs on large MT systems.
- */
-cpumask_t cpu_foreign_map __read_mostly;
-EXPORT_SYMBOL(cpu_foreign_map);
-
 /* representing cpus for which sibling maps can be computed */
 static cpumask_t cpu_sibling_setup_map;
 
@@ -110,29 +103,6 @@ static inline void set_cpu_core_map(int cpu)
 	}
 }
 
-/*
- * Calculate a new cpu_foreign_map mask whenever a
- * new cpu appears or disappears.
- */
-static inline void calculate_cpu_foreign_map(void)
-{
-	int i, k, core_present;
-	cpumask_t temp_foreign_map;
-
-	/* Re-calculate the mask */
-	for_each_online_cpu(i) {
-		core_present = 0;
-		for_each_cpu(k, &temp_foreign_map)
-			if (cpu_data[i].package == cpu_data[k].package &&
-			    cpu_data[i].core == cpu_data[k].core)
-				core_present = 1;
-		if (!core_present)
-			cpumask_set_cpu(i, &temp_foreign_map);
-	}
-
-	cpumask_copy(&cpu_foreign_map, &temp_foreign_map);
-}
-
 struct plat_smp_ops *mp_ops;
 EXPORT_SYMBOL(mp_ops);
 
@@ -176,8 +146,6 @@ asmlinkage void start_secondary(void)
 	set_cpu_sibling_map(cpu);
 	set_cpu_core_map(cpu);
 
-	calculate_cpu_foreign_map();
-
 	cpumask_set_cpu(cpu, &cpu_callin_map);
 
 	synchronise_count_slave(cpu);
@@ -195,18 +163,9 @@ asmlinkage void start_secondary(void)
 static void stop_this_cpu(void *dummy)
 {
 	/*
-	 * Remove this CPU. Be a bit slow here and
-	 * set the bits for every online CPU so we don't miss
-	 * any IPI whilst taking this VPE down.
+	 * Remove this CPU:
 	 */
-
-	cpumask_copy(&cpu_foreign_map, cpu_online_mask);
-
-	/* Make it visible to every other CPU */
-	smp_mb();
-
 	set_cpu_online(smp_processor_id(), false);
-	calculate_cpu_foreign_map();
 	local_irq_disable();
 	while (1);
 }
@@ -228,7 +187,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 	mp_ops->prepare_cpus(max_cpus);
 	set_cpu_sibling_map(0);
 	set_cpu_core_map(0);
-	calculate_cpu_foreign_map();
 #ifndef CONFIG_HOTPLUG_CPU
 	init_cpu_present(cpu_possible_mask);
 #endif
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index 5d3a25e..54f254c 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -61,7 +61,7 @@ static inline void r4k_on_each_cpu(void (*func) (void *info), void *info)
 	 * CM-based SMP protocols (CMP & CPS) restrict index-based cache ops.
 	 */
 	if (!mips_cm_present())
-		smp_call_function_many(&cpu_foreign_map, func, info, 1);
+		smp_call_function(func, info, 1);
 	func(info);
 	preempt_enable();
 }
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] MIPS: c-r4k: remove cpu_foreign_map
  2015-08-03 15:54 [PATCH] MIPS: c-r4k: remove cpu_foreign_map Paul Burton
@ 2015-08-03 16:18 ` Ralf Baechle
  0 siblings, 0 replies; 2+ messages in thread
From: Ralf Baechle @ 2015-08-03 16:18 UTC (permalink / raw)
  To: Paul Burton
  Cc: linux-mips, Rusty Russell, Joshua Kinard, Andrew Bresticker,
	Huacai Chen, Paul Gortmaker, Kevin Cernekee, linux-kernel,
	Maciej W. Rozycki, Markos Chandras, Alex Smith

On Mon, Aug 03, 2015 at 08:54:47AM -0700, Paul Burton wrote:

> Commit cccf34e9411c ("MIPS: c-r4k: Fix cache flushing for MT cores") did
> 2 things:
> 
>   - Introduced cpu_foreign_map to call cache maintenance functions on
>     only a single CPU within each core in the system.
> 
>   - Stopped calling cache maintenance functions on non-local CPUs for
>     systems which include a MIPS Coherence Manager.
> 
> Thus the introduction of cpu_foreign_map has no effect on any systems
> with a CM, since the IPIs will be avoided entirely. Thus it can only
> possibly affect other systems which have multiple logical CPUs per core,
> which appears to only be netlogic. I'm pretty certain this wasn't the
> intent, am unsure whether avoiding such cache maintenance calls is
> correct for netlogic systems and believe the overhead of calculating
> cpu_foreign_map is thus unnecessary & this code is almost certainly
> untested.
> 
> This mostly reverts commit cccf34e9411c ("MIPS: c-r4k: Fix cache
> flushing for MT cores"), leaving only the change for systems with a CM.

BMIPS is another "hyperthreading-like" core.  Maybe Kevin or Florian
can comment if this patch is good for them?

  Ralf

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-08-03 16:18 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-03 15:54 [PATCH] MIPS: c-r4k: remove cpu_foreign_map Paul Burton
2015-08-03 16:18 ` Ralf Baechle

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox