From 74499d325f9072130c0e4754e914f0f6e597a815 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 9 May 2004 23:30:22 -0700 Subject: [PATCH] [PATCH] migration_thread() race fix From: Srivatsa Vaddagiri 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. --- kernel/sched.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/sched.c b/kernel/sched.c index 422bfeb614e1e..d083166dd3f0a 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -3372,6 +3372,7 @@ static int migration_thread(void * data) 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; @@ -3393,10 +3394,10 @@ static int migration_thread(void * data) 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); @@ -3417,6 +3418,7 @@ static int migration_thread(void * data) complete(&req->done); } + __set_current_state(TASK_RUNNING); return 0; wait_to_die: -- 2.53.0