X-Git-Url: http://git.cascardo.info/?p=cascardo%2Flinux.git;a=blobdiff_plain;f=mm%2Fmemory.c;h=649e7d440bd763fa647d47722abb6471cb75ab79;hp=d8aebc52265f59e75e342051fa604c5f1003f59b;hb=60815cf2e05057db5b78e398d9734c493560b11e;hpb=d08372ca2800e23c51e76dea5fc516781e82722e diff --git a/mm/memory.c b/mm/memory.c index d8aebc52265f..649e7d440bd7 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3195,7 +3195,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) {