From: Vlastimil Babka Date: Tue, 24 Jun 2025 13:03:48 +0000 (+0200) Subject: mm, madvise: use standard madvise locking in madvise_set_anon_name() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9992554c9ca3eb929daf8ccb02cfbcb3dbc27d4f;p=thirdparty%2Flinux.git mm, madvise: use standard madvise locking in madvise_set_anon_name() Use madvise_lock()/madvise_unlock() in madvise_set_anon_name() in the same way as in do_madvise(). This narrows the lock scope a bit and reuses existing functionality. get_lock_mode() already picks the correct MADVISE_MMAP_WRITE_LOCK mode for __MADV_SET_ANON_VMA_NAME so we can just remove the explicit assignment. There is a user visible change in that the prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME...) might now return -EINTR. Link: https://lkml.kernel.org/r/20250624-anon_name_cleanup-v2-4-600075462a11@suse.cz Signed-off-by: Vlastimil Babka Tested-by: Lorenzo Stoakes Acked-by: David Hildenbrand Reviewed-by: Suren Baghdasaryan Reviewed-by: Lorenzo Stoakes Cc: Colin Cross Cc: Jann Horn Cc: Liam Howlett Cc: Michal Hocko Cc: Mike Rapoport Cc: SeongJae Park Signed-off-by: Andrew Morton --- diff --git a/mm/madvise.c b/mm/madvise.c index cb7d74d56debb..a34c2c89a53bb 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -2082,10 +2082,10 @@ static int madvise_set_anon_name(struct mm_struct *mm, unsigned long start, { unsigned long end; unsigned long len; + int error; struct madvise_behavior madv_behavior = { .mm = mm, .behavior = __MADV_SET_ANON_VMA_NAME, - .lock_mode = MADVISE_MMAP_WRITE_LOCK, .anon_name = anon_name, }; @@ -2106,7 +2106,14 @@ static int madvise_set_anon_name(struct mm_struct *mm, unsigned long start, madv_behavior.range.start = start; madv_behavior.range.end = end; - return madvise_walk_vmas(&madv_behavior); + + error = madvise_lock(&madv_behavior); + if (error) + return error; + error = madvise_walk_vmas(&madv_behavior); + madvise_unlock(&madv_behavior); + + return error; } int set_anon_vma_name(unsigned long addr, unsigned long size, @@ -2136,9 +2143,7 @@ int set_anon_vma_name(unsigned long addr, unsigned long size, return -ENOMEM; } - mmap_write_lock(mm); error = madvise_set_anon_name(mm, addr, size, anon_name); - mmap_write_unlock(mm); anon_vma_name_put(anon_name); return error;