Re: [PATCH] mm/page_vma_mapped_walk: add missing pgtable entry accessors

From: David Hildenbrand (Arm)

Date: Mon Apr 27 2026 - 05:24:47 EST


On 4/27/26 11:02, David Hildenbrand (Arm) wrote:
> On 4/27/26 07:20, Alexander Gordeev wrote:
>> Convert pgtable direct entry dereferences to the corresponding
>> pXdp_get() accessors. Use ptep_get_lockless() variant for PTE
>> reads when no lock is taken.
>>
>> Signed-off-by: Alexander Gordeev <agordeev@xxxxxxxxxxxxx>
>> ---
>> mm/page_vma_mapped.c | 12 ++++++------
>> 1 file changed, 6 insertions(+), 6 deletions(-)
>>
>> diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
>> index b38a1d00c971..a4520bb10d2a 100644
>> --- a/mm/page_vma_mapped.c
>> +++ b/mm/page_vma_mapped.c
>> @@ -41,7 +41,7 @@ static bool map_pte(struct page_vma_mapped_walk *pvmw, pmd_t *pmdvalp,
>> if (!pvmw->pte)
>> return false;
>>
>> - ptent = ptep_get(pvmw->pte);
>> + ptent = ptep_get_lockless(pvmw->pte);
>>
>> if (pte_none(ptent)) {
>> return false;
>> @@ -219,17 +219,17 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw)
>> restart:
>> do {
>> pgd = pgd_offset(mm, pvmw->address);
>> - if (!pgd_present(*pgd)) {
>> + if (!pgd_present(pgdp_get(pgd))) {
>> step_forward(pvmw, PGDIR_SIZE);
>> continue;
>> }
>> p4d = p4d_offset(pgd, pvmw->address);
>> - if (!p4d_present(*p4d)) {
>> + if (!p4d_present(p4dp_get(p4d))) {
>> step_forward(pvmw, P4D_SIZE);
>> continue;
>> }
>> pud = pud_offset(p4d, pvmw->address);
>> - if (!pud_present(*pud)) {
>> + if (!pud_present(pudp_get(pud))) {
>> step_forward(pvmw, PUD_SIZE);
>> continue;
>
> Wasn't there a problem with folded page tables, where we would no longer be able
> to optimize out the folded page table accesses?
>
> I thought we discussed ways to resolve that. Let me dig ...

Here is what I have after the discussion following
https://lore.kernel.org/all/0019d675-ce3d-4a5c-89ed-f126c45145c9@xxxxxxxxxx/.

Completely untested of course: