|
@@ -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);
|
|
|
|