Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −28
Original line number Original line Diff line number Diff line
@@ -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;