]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] use wait_task_inactive() in kthread_bind()
authorAndrew Morton <akpm@osdl.org>
Sat, 13 Mar 2004 11:26:09 +0000 (03:26 -0800)
committerLen Brown <len.brown@intel.com>
Sat, 13 Mar 2004 11:26:09 +0000 (03:26 -0800)
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

index 5ff536d19715a72c3dfb80892c836e3b4010b49a..cb59d76227dca2ddae3a90c82d42396949fe0096 100644 (file)
@@ -91,7 +91,6 @@ static void keventd_create_kthread(void *_create)
        } 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 (*threadfn)(void *data),
 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);
 }