diff options
| author | Ryan Roberts <[email protected]> | 2024-04-29 11:40:17 +0000 |
|---|---|---|
| committer | Andrew Morton <[email protected]> | 2024-05-06 00:28:06 +0000 |
| commit | c70dce4982ce1718bf978a35f8e26160b82081f4 (patch) | |
| tree | dbb2039efef18fb224215a1ab08a966b9547d0bc /lib/test_xarray.c | |
| parent | mm/vmalloc: fix return value of vb_alloc if size is 0 (diff) | |
| download | kernel-c70dce4982ce1718bf978a35f8e26160b82081f4.tar.gz kernel-c70dce4982ce1718bf978a35f8e26160b82081f4.zip | |
fs/proc/task_mmu: fix loss of young/dirty bits during pagemap scan
make_uffd_wp_pte() was previously doing:
pte = ptep_get(ptep);
ptep_modify_prot_start(ptep);
pte = pte_mkuffd_wp(pte);
ptep_modify_prot_commit(ptep, pte);
But if another thread accessed or dirtied the pte between the first 2
calls, this could lead to loss of that information. Since
ptep_modify_prot_start() gets and clears atomically, the following is the
correct pattern and prevents any possible race. Any access after the
first call would see an invalid pte and cause a fault:
pte = ptep_modify_prot_start(ptep);
pte = pte_mkuffd_wp(pte);
ptep_modify_prot_commit(ptep, pte);
Link: https://lkml.kernel.org/r/[email protected]
Fixes: 52526ca7fdb9 ("fs/proc/task_mmu: implement IOCTL to get and optionally clear info about PTEs")
Signed-off-by: Ryan Roberts <[email protected]>
Acked-by: David Hildenbrand <[email protected]>
Cc: Muhammad Usama Anjum <[email protected]>
Cc: Peter Xu <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Diffstat (limited to 'lib/test_xarray.c')
0 files changed, 0 insertions, 0 deletions
