aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched/core.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 1f37fe7f77a4..fd0a6ed21849 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -341,6 +341,22 @@ static struct rq *task_rq_lock(struct task_struct *p, unsigned long *flags)
341 raw_spin_lock_irqsave(&p->pi_lock, *flags); 341 raw_spin_lock_irqsave(&p->pi_lock, *flags);
342 rq = task_rq(p); 342 rq = task_rq(p);
343 raw_spin_lock(&rq->lock); 343 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 */
344 if (likely(rq == task_rq(p) && !task_on_rq_migrating(p))) 360 if (likely(rq == task_rq(p) && !task_on_rq_migrating(p)))
345 return rq; 361 return rq;
346 raw_spin_unlock(&rq->lock); 362 raw_spin_unlock(&rq->lock);