
From: Rusty Russell <rusty@rustcorp.com.au>

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);
 }
 

_
