summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gordeev <agordeev@linux.ibm.com>2026-05-28 09:55:07 +0200
committerAndrew Morton <akpm@linux-foundation.org>2026-06-08 18:21:26 -0700
commit3f08b20eb12f7a05824295d083561cfddfdf76c2 (patch)
treec82c27b7ab53896e0cc15c94ebd432547743d10d
parent3d4f1a54160046d5059ec6c5f2152e054e7b12d7 (diff)
mm/page_vma_mapped_walk: use ptep_get_lockless() for lockless access
When not holding the lock, there is a chance that the pte gets modified under our feet, so we need to use the lockless API to make sure that the entries remain consistent during the read." Switch from ptep_get() to ptep_get_lockless() accessor for PTE reads when no lock is taken. [osalvador@suse.de: changelog addition] Link: https://lore.kernel.org/ahhNq0pFKvSKZQbR@localhost.localdomain Link: https://lore.kernel.org/20260528075507.1821939-1-agordeev@linux.ibm.com Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> Reviewed-by: Oscar Salvador (SUSE) <osalvador@kernel.org> Acked-by: David Hildenbrand (Arm) <david@kernel.org> Reviewed-by: Lorenzo Stoakes <ljs@kernel.org> Cc: Anshuman Khandual <anshuman.khandual@arm.com> Cc: Harry Yoo <harry@kernel.org> Cc: Jann Horn <jannh@google.com> Cc: Liam Howlett <liam@infradead.org> Cc: Rik van Riel <riel@surriel.com> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: Wei Yang <richard.weiyang@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-rw-r--r--mm/page_vma_mapped.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
index a4d52fdb3056..2ccbabfb2cc1 100644
--- a/mm/page_vma_mapped.c
+++ b/mm/page_vma_mapped.c
@@ -41,7 +41,7 @@ again:
if (!pvmw->pte)
return false;
- ptent = ptep_get(pvmw->pte);
+ ptent = ptep_get_lockless(pvmw->pte);
if (pte_none(ptent)) {
return false;
@@ -183,6 +183,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
struct mm_struct *mm = vma->vm_mm;
unsigned long end;
spinlock_t *ptl;
+ pte_t pteval;
pgd_t *pgd;
p4d_t *p4d;
pud_t *pud;
@@ -310,7 +311,11 @@ next_pte:
goto restart;
}
pvmw->pte++;
- } while (pte_none(ptep_get(pvmw->pte)));
+ if (!pvmw->ptl)
+ pteval = ptep_get_lockless(pvmw->pte);
+ else
+ pteval = ptep_get(pvmw->pte);
+ } while (pte_none(pteval));
if (!pvmw->ptl) {
spin_lock(ptl);