Skip to content

Commit 74b8a4c

Browse files
Peter ZijlstraIngo Molnar
authored andcommitted
sched: Clarify ordering between task_rq_lock() and move_queued_task()
There was a wee bit of confusion around the exact ordering here; clarify things. Reported-by: Kirill Tkhai <ktkhai@parallels.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/20150217121258.GM5029@twins.programming.kicks-ass.net Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent e07e0d4 commit 74b8a4c

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

kernel/sched/core.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,22 @@ static struct rq *task_rq_lock(struct task_struct *p, unsigned long *flags)
341341
raw_spin_lock_irqsave(&p->pi_lock, *flags);
342342
rq = task_rq(p);
343343
raw_spin_lock(&rq->lock);
344+
/*
345+
* move_queued_task() task_rq_lock()
346+
*
347+
* ACQUIRE (rq->lock)
348+
* [S] ->on_rq = MIGRATING [L] rq = task_rq()
349+
* WMB (__set_task_cpu()) ACQUIRE (rq->lock);
350+
* [S] ->cpu = new_cpu [L] task_rq()
351+
* [L] ->on_rq
352+
* RELEASE (rq->lock)
353+
*
354+
* If we observe the old cpu in task_rq_lock, the acquire of
355+
* the old rq->lock will fully serialize against the stores.
356+
*
357+
* If we observe the new cpu in task_rq_lock, the acquire will
358+
* pair with the WMB to ensure we must then also see migrating.
359+
*/
344360
if (likely(rq == task_rq(p) && !task_on_rq_migrating(p)))
345361
return rq;
346362
raw_spin_unlock(&rq->lock);

0 commit comments

Comments
 (0)