Commit 4c07ad69 authored by Glauber de Oliveira Costa's avatar Glauber de Oliveira Costa Committed by Ingo Molnar

x86: don't span a new worker in __smp_prepare_cpu

We can do it now that do_boot_cpu has its own worker.
Signed-off-by: default avatarGlauber Costa <gcosta@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 365c894c
...@@ -699,44 +699,18 @@ void cpu_exit_clear(void) ...@@ -699,44 +699,18 @@ void cpu_exit_clear(void)
} }
#endif #endif
struct warm_boot_cpu_info {
struct completion *complete;
struct work_struct task;
int apicid;
int cpu;
};
static void __cpuinit do_warm_boot_cpu(struct work_struct *work)
{
struct warm_boot_cpu_info *info =
container_of(work, struct warm_boot_cpu_info, task);
do_boot_cpu(info->apicid, info->cpu);
complete(info->complete);
}
static void __cpuinit __smp_prepare_cpu(int cpu) static void __cpuinit __smp_prepare_cpu(int cpu)
{ {
DECLARE_COMPLETION_ONSTACK(done);
struct warm_boot_cpu_info info;
int apicid; int apicid;
apicid = per_cpu(x86_cpu_to_apicid, cpu); apicid = per_cpu(x86_cpu_to_apicid, cpu);
info.complete = &done;
info.apicid = apicid;
info.cpu = cpu;
INIT_WORK(&info.task, do_warm_boot_cpu);
/* init low mem mapping */ /* init low mem mapping */
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS, clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
min_t(unsigned long, KERNEL_PGD_PTRS, USER_PGD_PTRS)); min_t(unsigned long, KERNEL_PGD_PTRS, USER_PGD_PTRS));
flush_tlb_all(); flush_tlb_all();
if (!keventd_up() || current_is_keventd())
info.task.func(&info.task); do_boot_cpu(apicid, cpu);
else {
schedule_work(&info.task);
wait_for_completion(&done);
}
} }
static int boot_cpu_logical_apicid; static int boot_cpu_logical_apicid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment