From: Rusty Russell Make it clear that the reason we do wait_task_inactive is because kthread_bind frobs with k->thread_info->cpu, which is only legal because the task is definitely not running. We can't use the normal migration thread code here, because it doesn't let us bind to cpus which are offline yet, and also because we use this to start the migration threads themselves. --- kernel/kthread.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff -puN kernel/kthread.c~use-wait_task_inactive-in-kthread_bind kernel/kthread.c --- 25/kernel/kthread.c~use-wait_task_inactive-in-kthread_bind 2004-02-29 20:11:53.000000000 -0800 +++ 25-akpm/kernel/kthread.c 2004-02-29 20:11:53.000000000 -0800 @@ -91,7 +91,6 @@ static void keventd_create_kthread(void } else { wait_for_completion(&create->started); create->result = find_task_by_pid(pid); - wait_task_inactive(create->result); } complete(&create->done); } @@ -131,7 +130,9 @@ struct task_struct *kthread_create(int ( void kthread_bind(struct task_struct *k, unsigned int cpu) { BUG_ON(k->state != TASK_INTERRUPTIBLE); - k->thread_info->cpu = cpu; + /* Must have done schedule() in kthread() before we set_task_cpu */ + wait_task_inactive(k); + set_task_cpu(k, cpu); k->cpus_allowed = cpumask_of_cpu(cpu); } _