static inline unsigned int task_cpu(const struct task_struct *p)
 {
 #ifdef CONFIG_THREAD_INFO_IN_TASK
-       return p->cpu;
+       return READ_ONCE(p->cpu);
 #else
-       return task_thread_info(p)->cpu;
+       return READ_ONCE(task_thread_info(p)->cpu);
 #endif
 }
 
 
                 *                                      [L] ->on_rq
                 *      RELEASE (rq->lock)
                 *
-                * If we observe the old CPU in task_rq_lock, the acquire of
+                * If we observe the old CPU in task_rq_lock(), the acquire of
                 * the old rq->lock will fully serialize against the stores.
                 *
-                * If we observe the new CPU in task_rq_lock, the acquire will
-                * pair with the WMB to ensure we must then also see migrating.
+                * If we observe the new CPU in task_rq_lock(), the address
+                * dependency headed by '[L] rq = task_rq()' and the acquire
+                * will pair with the WMB to ensure we then also see migrating.
                 */
                if (likely(rq == task_rq(p) && !task_on_rq_migrating(p))) {
                        rq_pin_lock(rq, rf);
 {
        lockdep_assert_held(&rq->lock);
 
-       p->on_rq = TASK_ON_RQ_MIGRATING;
+       WRITE_ONCE(p->on_rq, TASK_ON_RQ_MIGRATING);
        dequeue_task(rq, p, DEQUEUE_NOCLOCK);
        set_task_cpu(p, new_cpu);
        rq_unlock(rq, rf);
 
         */
        smp_wmb();
 #ifdef CONFIG_THREAD_INFO_IN_TASK
-       p->cpu = cpu;
+       WRITE_ONCE(p->cpu, cpu);
 #else
-       task_thread_info(p)->cpu = cpu;
+       WRITE_ONCE(task_thread_info(p)->cpu, cpu);
 #endif
        p->wake_cpu = cpu;
 #endif
 
 static inline int task_on_rq_migrating(struct task_struct *p)
 {
-       return p->on_rq == TASK_ON_RQ_MIGRATING;
+       return READ_ONCE(p->on_rq) == TASK_ON_RQ_MIGRATING;
 }
 
 /*