mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
mm/mremap: use pudp_huge_get_and_clear() when moving huge PUDs
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: 7d846db7d0 ("mm/mremap: convert huge PUD move to separate helper")
Cc: stable@vger.kernel.org
Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Reviewed-by: Pedro Falcato <pfalcato@suse.de>
Reviewed-by: Dev Jain <dev.jain@arm.com>
Tested-by: Muhammad Usama Anjum <usama.anjum@arm.com>
Link: https://patch.msgid.link/20261031-fixes_core-v3-30-d6437171ecc3@kernel.org
Reviewed-by: Lance Yang <lance.yang@linux.dev>
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
This commit is contained in:
parent
5ad9e4b0f1
commit
b4417d0803
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user