Commit 74499d32 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] migration_thread() race fix

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.
parent 870d3c0a
...@@ -3372,6 +3372,7 @@ static int migration_thread(void * data) ...@@ -3372,6 +3372,7 @@ static int migration_thread(void * data)
rq = cpu_rq(cpu); rq = cpu_rq(cpu);
BUG_ON(rq->migration_thread != current); BUG_ON(rq->migration_thread != current);
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) { while (!kthread_should_stop()) {
struct list_head *head; struct list_head *head;
migration_req_t *req; migration_req_t *req;
...@@ -3393,10 +3394,10 @@ static int migration_thread(void * data) ...@@ -3393,10 +3394,10 @@ static int migration_thread(void * data)
head = &rq->migration_queue; head = &rq->migration_queue;
current->state = TASK_INTERRUPTIBLE;
if (list_empty(head)) { if (list_empty(head)) {
spin_unlock_irq(&rq->lock); spin_unlock_irq(&rq->lock);
schedule(); schedule();
set_current_state(TASK_INTERRUPTIBLE);
continue; continue;
} }
req = list_entry(head->next, migration_req_t, list); req = list_entry(head->next, migration_req_t, list);
...@@ -3417,6 +3418,7 @@ static int migration_thread(void * data) ...@@ -3417,6 +3418,7 @@ static int migration_thread(void * data)
complete(&req->done); complete(&req->done);
} }
__set_current_state(TASK_RUNNING);
return 0; return 0;
wait_to_die: wait_to_die:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment