]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm, madvise: use standard madvise locking in madvise_set_anon_name()
authorVlastimil Babka <vbabka@suse.cz>
Tue, 24 Jun 2025 13:03:48 +0000 (15:03 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 13 Jul 2025 23:38:14 +0000 (16:38 -0700)
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>
mm/madvise.c

index cb7d74d56debbd0e5b2664cd7acd1ddada01db23..a34c2c89a53bb9ef8e659d8b27a11bcf60b07294 100644 (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;