From: Srivatsa Vaddagiri <vatsa@in.ibm.com>
Noticed that migration_thread can examine "kthread_should_stop()?" without
setting its state to TASK_INTERRUPTIBLE first. This can cause kthread_stop
on that thread to block forever ...
P.S - I assumed that having the task state set to TASK_INTERRUTIBLE
while it is doing active_load_balance is fine. It seemed to be
the case earlier also.
rq = cpu_rq(cpu);
BUG_ON(rq->migration_thread != current);
+ set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {
struct list_head *head;
migration_req_t *req;
head = &rq->migration_queue;
- current->state = TASK_INTERRUPTIBLE;
if (list_empty(head)) {
spin_unlock_irq(&rq->lock);
schedule();
+ set_current_state(TASK_INTERRUPTIBLE);
continue;
}
req = list_entry(head->next, migration_req_t, list);
complete(&req->done);
}
+ __set_current_state(TASK_RUNNING);
return 0;
wait_to_die: