dect
/
linux-2.6
Archived
13
0
Fork 0

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: Glauber Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Glauber de Oliveira Costa 2008-03-19 14:25:46 -03:00 committed by Ingo Molnar
parent 365c894c65
commit 4c07ad6950
1 changed files with 2 additions and 28 deletions

View File

@ -699,44 +699,18 @@ void cpu_exit_clear(void)
}
#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)
{
DECLARE_COMPLETION_ONSTACK(done);
struct warm_boot_cpu_info info;
int apicid;
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 */
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
min_t(unsigned long, KERNEL_PGD_PTRS, USER_PGD_PTRS));
flush_tlb_all();
if (!keventd_up() || current_is_keventd())
info.task.func(&info.task);
else {
schedule_work(&info.task);
wait_for_completion(&done);
}
do_boot_cpu(apicid, cpu);
}
static int boot_cpu_logical_apicid;