___p1;                                                          \
 })
 
+/*
+ * This must resolve to hwsync on SMP for the context switch path.
+ * See _switch, and core scheduler context switch memory ordering
+ * comments.
+ */
 #define smp_mb__before_spinlock()   smp_mb()
 
 #include <asm-generic/barrier.h>
 
        std     r23,_CCR(r1)
        std     r1,KSP(r3)      /* Set old stack pointer */
 
-#ifdef CONFIG_SMP
-       /* We need a sync somewhere here to make sure that if the
-        * previous task gets rescheduled on another CPU, it sees all
-        * stores it has performed on this one.
+       /*
+        * On SMP kernels, care must be taken because a task may be
+        * scheduled off CPUx and on to CPUy. Memory ordering must be
+        * considered.
+        *
+        * Cacheable stores on CPUx will be visible when the task is
+        * scheduled on CPUy by virtue of the core scheduler barriers
+        * (see "Notes on Program-Order guarantees on SMP systems." in
+        * kernel/sched/core.c).
+        *
+        * Uncacheable stores in the case of involuntary preemption must
+        * be taken care of. The smp_mb__before_spin_lock() in __schedule()
+        * is implemented as hwsync on powerpc, which orders MMIO too. So
+        * long as there is an hwsync in the context switch path, it will
+        * be executed on the source CPU after the task has performed
+        * all MMIO ops on that CPU, and on the destination CPU before the
+        * task performs any MMIO ops there.
         */
-       sync
-#endif /* CONFIG_SMP */
 
        /*
         * The kernel context switch path must contain a spin_lock,