ARM: mm: don't flush icache in switch_mm with hardware broadcasting
Subsystems (2)
PATCH 1/2 ARM: mm: don't flush icache in switch_mm with hardware broadcasting
When scheduling an mm on a CPU where it hasn't previously been used, we flush the icache on that CPU so that any code loaded previously on a different core can be safely executed.
For cores with hardware broadcasting of cache maintenance operations, this is clearly unnecessary, since the inner-shareable invalidation in __sync_icache_dcache will affect all CPUs.
This patch conditionalises the icache flush in switch_mm based on cache_ops_need_broadcast().
--- arch/arm/include/asm/mmu_context.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
arch/arm/include/asm/mmu_context.h +9 -4
@@ -18,6 +18,7 @@#include <asm/cacheflush.h> #include <asm/cachetype.h> #include <asm/proc-fns.h> +#include <asm/smp_plat.h> #include <asm-generic/mm_hooks.h> void __check_vmalloc_seq (struct mm_struct *mm);
@@ -98,12 +99,16 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next,#ifdef CONFIG_MMU unsigned int cpu =smp_processor_id (); -#ifdef CONFIG_SMP -/* check for possible thread migration */ -if (!cpumask_empty (mm_cpumask (next)) && +/* +* __sync_icache_dcache doesn't broadcast the I-cache invalidation, +* so check for possible thread migration and invalidate the I-cache +* if we're new to this CPU. +*/ +if (cache_ops_need_broadcast () && + !cpumask_empty (mm_cpumask (next)) && !cpumask_test_cpu (cpu,mm_cpumask (next)))__flush_icache_all (); -#endif +if (!cpumask_test_and_set_cpu (cpu,mm_cpumask (next)) || prev != next) {check_and_switch_context (next, tsk);if (cache_is_vivt ())
Signature · 1 line
1.8.2.2
PATCH 2/2 arm64: mm: don't bother invalidating the icache in switch_mm
We don't support software broadcast of cache maintenance operations, so this flush is not required (__sync_icache_dcache will always affect all CPUs).
--- arch/arm64/include/asm/mmu_context.h | 6 ------ 1 file changed, 6 deletions(-)
arch/arm64/include/asm/mmu_context.h +0 -6
@@ -151,12 +151,6 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next, {unsigned int cpu =smp_processor_id (); -#ifdef CONFIG_SMP -/* check for possible thread migration */ -if (!cpumask_empty (mm_cpumask (next)) && - !cpumask_test_cpu (cpu,mm_cpumask (next))) -__flush_icache_all (); -#endif if (!cpumask_test_and_set_cpu (cpu,mm_cpumask (next)) || prev != next)check_and_switch_context (next, tsk); }
Signature · 1 line
1.8.2.2