Re: [PATCH 29/46] mm/mremap: use pudp_huge_get_and_clear() when moving huge PUDs
From: Dev Jain
Date: Thu Oct 29 2026 - 04:05:40 EST
On 27/10/26 4:47 am, David Hildenbrand (Arm) wrote:
> move_huge_pud() reads the old PUD and clears it in separate operations.
> Hardware accessed or dirty updates between those operations can be lost
> when the saved entry is installed at the new address.
>
> The raw pud_clear() also bypasses page_table_check_pud_clear(), while
> set_pud_at() accounts for the destination mapping. This leaves the
> checker counts unbalanced for mappings tracked by page table checking.
>
> To fix it, simply use pudp_huge_get_and_clear().
>
> Fixes: 7d846db7d0e2 ("mm/mremap: convert huge PUD move to separate helper")
> Cc: stable@xxxxxxxxxxxxxxx
> Reviewed-by: Lorenzo Stoakes (ARM) <ljs@xxxxxxxxxx>
> Signed-off-by: David Hildenbrand (Arm) <david@xxxxxxxxxx>
> ---
Reviewed-by: Dev Jain <dev.jain@xxxxxxx>
> mm/mremap.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/mm/mremap.c b/mm/mremap.c
> index 0d06d7f37f19a..16e736c72d9cb 100644
> --- a/mm/mremap.c
> +++ b/mm/mremap.c
> @@ -509,8 +509,7 @@ static bool move_huge_pud(struct pagetable_move_control *pmc,
> spin_lock_nested(new_ptl, SINGLE_DEPTH_NESTING);
>
> /* Clear the pud */
> - pud = *old_pud;
> - pud_clear(old_pud);
> + pud = pudp_huge_get_and_clear(mm, pmc->old_addr, old_pud);
>
> VM_BUG_ON(!pud_none(*new_pud));
>
>