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 <vbabka@suse.cz>
Tested-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Suren Baghdasaryan <surenb@google.com>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Colin Cross <ccross@google.com>
Cc: Jann Horn <jannh@google.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Vlastimil Babka 2025-06-24 15:03:48 +02:00 committed by Andrew Morton
parent 986738ce44
commit 9992554c9c

View File

@ -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;