diff options
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
| -rw-r--r-- | arch/x86/kernel/smpboot.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index dfb50890b5b7..6af118511b4a 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -299,22 +299,16 @@ notrace static void __cpuinit start_secondary(void *unused) | |||
| 299 | * fragile that we want to limit the things done here to the | 299 | * fragile that we want to limit the things done here to the |
| 300 | * most necessary things. | 300 | * most necessary things. |
| 301 | */ | 301 | */ |
| 302 | cpu_init(); | ||
| 303 | preempt_disable(); | ||
| 304 | smp_callin(); | ||
| 302 | 305 | ||
| 303 | #ifdef CONFIG_X86_32 | 306 | #ifdef CONFIG_X86_32 |
| 304 | /* | 307 | /* switch away from the initial page table */ |
| 305 | * Switch away from the trampoline page-table | ||
| 306 | * | ||
| 307 | * Do this before cpu_init() because it needs to access per-cpu | ||
| 308 | * data which may not be mapped in the trampoline page-table. | ||
| 309 | */ | ||
| 310 | load_cr3(swapper_pg_dir); | 308 | load_cr3(swapper_pg_dir); |
| 311 | __flush_tlb_all(); | 309 | __flush_tlb_all(); |
| 312 | #endif | 310 | #endif |
| 313 | 311 | ||
| 314 | cpu_init(); | ||
| 315 | preempt_disable(); | ||
| 316 | smp_callin(); | ||
| 317 | |||
| 318 | /* otherwise gcc will move up smp_processor_id before the cpu_init */ | 312 | /* otherwise gcc will move up smp_processor_id before the cpu_init */ |
| 319 | barrier(); | 313 | barrier(); |
| 320 | /* | 314 | /* |
| @@ -785,7 +779,6 @@ do_rest: | |||
| 785 | #ifdef CONFIG_X86_32 | 779 | #ifdef CONFIG_X86_32 |
| 786 | /* Stack for startup_32 can be just as for start_secondary onwards */ | 780 | /* Stack for startup_32 can be just as for start_secondary onwards */ |
| 787 | irq_ctx_init(cpu); | 781 | irq_ctx_init(cpu); |
| 788 | initial_page_table = __pa(&trampoline_pg_dir); | ||
| 789 | #else | 782 | #else |
| 790 | clear_tsk_thread_flag(c_idle.idle, TIF_FORK); | 783 | clear_tsk_thread_flag(c_idle.idle, TIF_FORK); |
| 791 | initial_gs = per_cpu_offset(cpu); | 784 | initial_gs = per_cpu_offset(cpu); |
| @@ -934,7 +927,6 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
| 934 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; | 927 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
| 935 | 928 | ||
| 936 | err = do_boot_cpu(apicid, cpu); | 929 | err = do_boot_cpu(apicid, cpu); |
| 937 | |||
| 938 | if (err) { | 930 | if (err) { |
| 939 | pr_debug("do_boot_cpu failed %d\n", err); | 931 | pr_debug("do_boot_cpu failed %d\n", err); |
| 940 | return -EIO; | 932 | return -EIO; |
