aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
Diffstat (limited to 'mm')
-rw-r--r--mm/gup.c2
-rw-r--r--mm/memory.c11
-rw-r--r--mm/rmap.c3
3 files changed, 13 insertions, 3 deletions
diff --git a/mm/gup.c b/mm/gup.c
index cd62c8c90d4a..f2305deaef50 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -917,7 +917,7 @@ static int gup_pud_range(pgd_t *pgdp, unsigned long addr, unsigned long end,
917 917
918 pudp = pud_offset(pgdp, addr); 918 pudp = pud_offset(pgdp, addr);
919 do { 919 do {
920 pud_t pud = ACCESS_ONCE(*pudp); 920 pud_t pud = READ_ONCE(*pudp);
921 921
922 next = pud_addr_end(addr, end); 922 next = pud_addr_end(addr, end);
923 if (pud_none(pud)) 923 if (pud_none(pud))
diff --git a/mm/memory.c b/mm/memory.c
index 3e503831e042..d86aa88902a0 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -3202,7 +3202,16 @@ static int handle_pte_fault(struct mm_struct *mm,
3202 pte_t entry; 3202 pte_t entry;
3203 spinlock_t *ptl; 3203 spinlock_t *ptl;
3204 3204
3205 entry = ACCESS_ONCE(*pte); 3205 /*
3206 * some architectures can have larger ptes than wordsize,
3207 * e.g.ppc44x-defconfig has CONFIG_PTE_64BIT=y and CONFIG_32BIT=y,
3208 * so READ_ONCE or ACCESS_ONCE cannot guarantee atomic accesses.
3209 * The code below just needs a consistent view for the ifs and
3210 * we later double check anyway with the ptl lock held. So here
3211 * a barrier will do.
3212 */
3213 entry = *pte;
3214 barrier();
3206 if (!pte_present(entry)) { 3215 if (!pte_present(entry)) {
3207 if (pte_none(entry)) { 3216 if (pte_none(entry)) {
3208 if (vma->vm_ops) { 3217 if (vma->vm_ops) {
diff --git a/mm/rmap.c b/mm/rmap.c
index 19886fb2f13a..1e542744e131 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -581,7 +581,8 @@ pmd_t *mm_find_pmd(struct mm_struct *mm, unsigned long address)
581 * without holding anon_vma lock for write. So when looking for a 581 * without holding anon_vma lock for write. So when looking for a
582 * genuine pmde (in which to find pte), test present and !THP together. 582 * genuine pmde (in which to find pte), test present and !THP together.
583 */ 583 */
584 pmde = ACCESS_ONCE(*pmd); 584 pmde = *pmd;
585 barrier();
585 if (!pmd_present(pmde) || pmd_trans_huge(pmde)) 586 if (!pmd_present(pmde) || pmd_trans_huge(pmde))
586 pmd = NULL; 587 pmd = NULL;
587out: 588out: