diff options
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r-- | arch/x86/kernel/smpboot.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index a5e928b0cb5f..abf4a86ffc54 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -73,7 +73,6 @@ | |||
73 | 73 | ||
74 | #ifdef CONFIG_X86_32 | 74 | #ifdef CONFIG_X86_32 |
75 | u8 apicid_2_node[MAX_APICID]; | 75 | u8 apicid_2_node[MAX_APICID]; |
76 | static int low_mappings; | ||
77 | #endif | 76 | #endif |
78 | 77 | ||
79 | /* State of each CPU */ | 78 | /* State of each CPU */ |
@@ -281,6 +280,18 @@ notrace static void __cpuinit start_secondary(void *unused) | |||
281 | * fragile that we want to limit the things done here to the | 280 | * fragile that we want to limit the things done here to the |
282 | * most necessary things. | 281 | * most necessary things. |
283 | */ | 282 | */ |
283 | |||
284 | #ifdef CONFIG_X86_32 | ||
285 | /* | ||
286 | * Switch away from the trampoline page-table | ||
287 | * | ||
288 | * Do this before cpu_init() because it needs to access per-cpu | ||
289 | * data which may not be mapped in the trampoline page-table. | ||
290 | */ | ||
291 | load_cr3(swapper_pg_dir); | ||
292 | __flush_tlb_all(); | ||
293 | #endif | ||
294 | |||
284 | vmi_bringup(); | 295 | vmi_bringup(); |
285 | cpu_init(); | 296 | cpu_init(); |
286 | preempt_disable(); | 297 | preempt_disable(); |
@@ -299,12 +310,6 @@ notrace static void __cpuinit start_secondary(void *unused) | |||
299 | legacy_pic->chip->unmask(0); | 310 | legacy_pic->chip->unmask(0); |
300 | } | 311 | } |
301 | 312 | ||
302 | #ifdef CONFIG_X86_32 | ||
303 | while (low_mappings) | ||
304 | cpu_relax(); | ||
305 | __flush_tlb_all(); | ||
306 | #endif | ||
307 | |||
308 | /* This must be done before setting cpu_online_mask */ | 313 | /* This must be done before setting cpu_online_mask */ |
309 | set_cpu_sibling_map(raw_smp_processor_id()); | 314 | set_cpu_sibling_map(raw_smp_processor_id()); |
310 | wmb(); | 315 | wmb(); |
@@ -750,6 +755,7 @@ do_rest: | |||
750 | #ifdef CONFIG_X86_32 | 755 | #ifdef CONFIG_X86_32 |
751 | /* Stack for startup_32 can be just as for start_secondary onwards */ | 756 | /* Stack for startup_32 can be just as for start_secondary onwards */ |
752 | irq_ctx_init(cpu); | 757 | irq_ctx_init(cpu); |
758 | initial_page_table = __pa(&trampoline_pg_dir); | ||
753 | #else | 759 | #else |
754 | clear_tsk_thread_flag(c_idle.idle, TIF_FORK); | 760 | clear_tsk_thread_flag(c_idle.idle, TIF_FORK); |
755 | initial_gs = per_cpu_offset(cpu); | 761 | initial_gs = per_cpu_offset(cpu); |
@@ -897,20 +903,8 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
897 | 903 | ||
898 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; | 904 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
899 | 905 | ||
900 | #ifdef CONFIG_X86_32 | ||
901 | /* init low mem mapping */ | ||
902 | clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY, | ||
903 | min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY)); | ||
904 | flush_tlb_all(); | ||
905 | low_mappings = 1; | ||
906 | |||
907 | err = do_boot_cpu(apicid, cpu); | 906 | err = do_boot_cpu(apicid, cpu); |
908 | 907 | ||
909 | zap_low_mappings(false); | ||
910 | low_mappings = 0; | ||
911 | #else | ||
912 | err = do_boot_cpu(apicid, cpu); | ||
913 | #endif | ||
914 | if (err) { | 908 | if (err) { |
915 | pr_debug("do_boot_cpu failed %d\n", err); | 909 | pr_debug("do_boot_cpu failed %d\n", err); |
916 | return -EIO; | 910 | return -EIO; |