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 8e20754dd31d..fbc8b2623d82 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
| @@ -294,18 +294,24 @@ static void percpu_timer_setup(void); | |||
| 294 | asmlinkage void __cpuinit secondary_start_kernel(void) | 294 | asmlinkage void __cpuinit secondary_start_kernel(void) |
| 295 | { | 295 | { |
| 296 | struct mm_struct *mm = &init_mm; | 296 | struct mm_struct *mm = &init_mm; |
| 297 | unsigned int cpu = smp_processor_id(); | 297 | unsigned int cpu; |
| 298 | |||
| 299 | /* | ||
| 300 | * The identity mapping is uncached (strongly ordered), so | ||
| 301 | * switch away from it before attempting any exclusive accesses. | ||
| 302 | */ | ||
| 303 | cpu_switch_mm(mm->pgd, mm); | ||
| 304 | enter_lazy_tlb(mm, current); | ||
| 305 | local_flush_tlb_all(); | ||
| 298 | 306 | ||
| 299 | /* | 307 | /* |
| 300 | * All kernel threads share the same mm context; grab a | 308 | * All kernel threads share the same mm context; grab a |
| 301 | * reference and switch to it. | 309 | * reference and switch to it. |
| 302 | */ | 310 | */ |
| 311 | cpu = smp_processor_id(); | ||
| 303 | atomic_inc(&mm->mm_count); | 312 | atomic_inc(&mm->mm_count); |
| 304 | current->active_mm = mm; | 313 | current->active_mm = mm; |
| 305 | cpumask_set_cpu(cpu, mm_cpumask(mm)); | 314 | cpumask_set_cpu(cpu, mm_cpumask(mm)); |
| 306 | cpu_switch_mm(mm->pgd, mm); | ||
| 307 | enter_lazy_tlb(mm, current); | ||
| 308 | local_flush_tlb_all(); | ||
| 309 | 315 | ||
| 310 | printk("CPU%u: Booted secondary processor\n", cpu); | 316 | printk("CPU%u: Booted secondary processor\n", cpu); |
| 311 | 317 | ||
