diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
| -rw-r--r-- | arch/arm/kernel/smp.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 8e20754dd31..fbc8b2623d8 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -294,18 +294,24 @@ static void percpu_timer_setup(void);  asmlinkage void __cpuinit secondary_start_kernel(void)  {  	struct mm_struct *mm = &init_mm; -	unsigned int cpu = smp_processor_id(); +	unsigned int cpu; + +	/* +	 * The identity mapping is uncached (strongly ordered), so +	 * switch away from it before attempting any exclusive accesses. +	 */ +	cpu_switch_mm(mm->pgd, mm); +	enter_lazy_tlb(mm, current); +	local_flush_tlb_all();  	/*  	 * All kernel threads share the same mm context; grab a  	 * reference and switch to it.  	 */ +	cpu = smp_processor_id();  	atomic_inc(&mm->mm_count);  	current->active_mm = mm;  	cpumask_set_cpu(cpu, mm_cpumask(mm)); -	cpu_switch_mm(mm->pgd, mm); -	enter_lazy_tlb(mm, current); -	local_flush_tlb_all();  	printk("CPU%u: Booted secondary processor\n", cpu);  |