mm: replace ACCESS_ONCE with READ_ONCE or barriers
[firefly-linux-kernel-4.4.55.git] / mm / memory.c
index 3e503831e042a6aa7b96d2608ecb570dfffa0aa7..d86aa88902a0ba559961cf8cc6589b56ebf0e61e 100644 (file)
@@ -3202,7 +3202,16 @@ static int handle_pte_fault(struct mm_struct *mm,
        pte_t entry;
        spinlock_t *ptl;
 
-       entry = ACCESS_ONCE(*pte);
+       /*
+        * some architectures can have larger ptes than wordsize,
+        * e.g.ppc44x-defconfig has CONFIG_PTE_64BIT=y and CONFIG_32BIT=y,
+        * so READ_ONCE or ACCESS_ONCE cannot guarantee atomic accesses.
+        * The code below just needs a consistent view for the ifs and
+        * we later double check anyway with the ptl lock held. So here
+        * a barrier will do.
+        */
+       entry = *pte;
+       barrier();
        if (!pte_present(entry)) {
                if (pte_none(entry)) {
                        if (vma->vm_ops) {