]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm: consistently use current->mm in mm_get_unmapped_area()
authorRyan Roberts <ryan.roberts@arm.com>
Fri, 3 Oct 2025 15:53:04 +0000 (16:53 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Nov 2025 01:27:57 +0000 (17:27 -0800)
mm_get_unmapped_area() is a wrapper around arch_get_unmapped_area() /
arch_get_unmapped_area_topdown(), both of which search current->mm for
some free space.  Neither take an mm_struct - they implicitly operate on
current->mm.

But the wrapper takes an mm_struct and uses it to decide whether to search
bottom up or top down.  All callers pass in current->mm for this, so
everything is working consistently.  But it feels like an accident waiting
to happen; eventually someone will call that function with a different mm,
expecting to find free space in it, but what gets returned is free space
in the current mm.

So let's simplify by removing the parameter and have the wrapper use
current->mm to decide which end to start at.  Now everything is consistent
and self-documenting.

Link: https://lkml.kernel.org/r/20251003155306.2147572-1-ryan.roberts@arm.com
Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Oscar Salvador <osalvador@suse.de>
Reviewed-by: Dev Jain <dev.jain@arm.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
14 files changed:
arch/sparc/kernel/sys_sparc_64.c
arch/x86/kernel/cpu/sgx/driver.c
drivers/char/mem.c
drivers/dax/device.c
fs/hugetlbfs/inode.c
fs/proc/inode.c
fs/ramfs/file-mmu.c
include/linux/sched/mm.h
io_uring/memmap.c
kernel/bpf/arena.c
kernel/bpf/syscall.c
mm/huge_memory.c
mm/mmap.c
mm/shmem.c

index 55faf2effa46c690bdba691a39a0aca53e74eaca..dbf118b4060110ce3dc7ba50eb5b8e4b1e596387 100644 (file)
@@ -241,7 +241,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u
 
        if (flags & MAP_FIXED) {
                /* Ok, don't mess with it. */
-               return mm_get_unmapped_area(current->mm, NULL, orig_addr, len, pgoff, flags);
+               return mm_get_unmapped_area(NULL, orig_addr, len, pgoff, flags);
        }
        flags &= ~MAP_SHARED;
 
@@ -254,7 +254,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u
                align_goal = (64UL * 1024);
 
        do {
-               addr = mm_get_unmapped_area(current->mm, NULL, orig_addr,
+               addr = mm_get_unmapped_area(NULL, orig_addr,
                                            len + (align_goal - PAGE_SIZE), pgoff, flags);
                if (!(addr & ~PAGE_MASK)) {
                        addr = (addr + (align_goal - 1UL)) & ~(align_goal - 1UL);
@@ -273,7 +273,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u
         * be obtained.
         */
        if (addr & ~PAGE_MASK)
-               addr = mm_get_unmapped_area(current->mm, NULL, orig_addr, len, pgoff, flags);
+               addr = mm_get_unmapped_area(NULL, orig_addr, len, pgoff, flags);
 
        return addr;
 }
index 7f8d1e11dbee24be7482fcd19f6eb51c75e5e49e..3b3efadb8cae8e067513b6e3bd7b1e8d79ed2d32 100644 (file)
@@ -113,7 +113,7 @@ static unsigned long sgx_get_unmapped_area(struct file *file,
        if (flags & MAP_FIXED)
                return addr;
 
-       return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags);
+       return mm_get_unmapped_area(file, addr, len, pgoff, flags);
 }
 
 #ifdef CONFIG_COMPAT
index 34b815901b205be4bf3b740bec669fcf85d889b4..db1ca53a6d0155afdcc8e9ed92eb1eb1d16878c6 100644 (file)
@@ -542,7 +542,7 @@ static unsigned long get_unmapped_area_zero(struct file *file,
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
        return thp_get_unmapped_area(file, addr, len, pgoff, flags);
 #else
-       return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags);
+       return mm_get_unmapped_area(file, addr, len, pgoff, flags);
 #endif
 }
 #endif /* CONFIG_MMU */
index 2bb40a6060af3bdd9f8cf3fc08dc0546904ddd70..7f1ed0db8337e23904e4962ee0d9184b47875ada 100644 (file)
@@ -330,14 +330,13 @@ static unsigned long dax_get_unmapped_area(struct file *filp,
        if ((off + len_align) < off)
                goto out;
 
-       addr_align = mm_get_unmapped_area(current->mm, filp, addr, len_align,
-                                         pgoff, flags);
+       addr_align = mm_get_unmapped_area(filp, addr, len_align, pgoff, flags);
        if (!IS_ERR_VALUE(addr_align)) {
                addr_align += (off - addr_align) & (align - 1);
                return addr_align;
        }
  out:
-       return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags);
+       return mm_get_unmapped_area(filp, addr, len, pgoff, flags);
 }
 
 static const struct address_space_operations dev_dax_aops = {
index f42548ee9083c6bf4b20f9a75e069e5f69fdfc3a..ce8e40d350322e17edba9dd1ccf5431e9c1778fc 100644 (file)
@@ -184,8 +184,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
        if (addr)
                addr0 = ALIGN(addr, huge_page_size(h));
 
-       return mm_get_unmapped_area_vmflags(current->mm, file, addr0, len, pgoff,
-                                           flags, 0);
+       return mm_get_unmapped_area_vmflags(file, addr0, len, pgoff, flags, 0);
 }
 
 /*
index d9b7ef1223437d4412e5a9b961f6481344f92576..2d3425cfa94b423926584de27f9e34c01cfaca02 100644 (file)
@@ -443,7 +443,7 @@ pde_get_unmapped_area(struct proc_dir_entry *pde, struct file *file, unsigned lo
                return pde->proc_ops->proc_get_unmapped_area(file, orig_addr, len, pgoff, flags);
 
 #ifdef CONFIG_MMU
-       return mm_get_unmapped_area(current->mm, file, orig_addr, len, pgoff, flags);
+       return mm_get_unmapped_area(file, orig_addr, len, pgoff, flags);
 #endif
 
        return orig_addr;
index b11f5b20b78b83dd44b1b3b667f7fdda0cf5f334..c3ed1c5117b23c856541cd5a9e409d6989e3899d 100644 (file)
@@ -35,7 +35,7 @@ static unsigned long ramfs_mmu_get_unmapped_area(struct file *file,
                unsigned long addr, unsigned long len, unsigned long pgoff,
                unsigned long flags)
 {
-       return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags);
+       return mm_get_unmapped_area(file, addr, len, pgoff, flags);
 }
 
 const struct file_operations ramfs_file_operations = {
index a74582aed7473af77bb72d76ca04c06f48159c2a..0e1d73955fa511c8b2167b3a24b4a1c24717fb91 100644 (file)
@@ -189,12 +189,11 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
                               unsigned long len, unsigned long pgoff,
                               unsigned long flags, vm_flags_t);
 
-unsigned long mm_get_unmapped_area(struct mm_struct *mm, struct file *filp,
-                                  unsigned long addr, unsigned long len,
-                                  unsigned long pgoff, unsigned long flags);
+unsigned long mm_get_unmapped_area(struct file *filp, unsigned long addr,
+                                  unsigned long len, unsigned long pgoff,
+                                  unsigned long flags);
 
-unsigned long mm_get_unmapped_area_vmflags(struct mm_struct *mm,
-                                          struct file *filp,
+unsigned long mm_get_unmapped_area_vmflags(struct file *filp,
                                           unsigned long addr,
                                           unsigned long len,
                                           unsigned long pgoff,
index add03ca75cb90eb4040916b69731e40855a12da8..63fcfa757bb8b6b47de8ed19938be60613a8804c 100644 (file)
@@ -387,7 +387,7 @@ unsigned long io_uring_get_unmapped_area(struct file *filp, unsigned long addr,
 #else
        addr = 0UL;
 #endif
-       return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags);
+       return mm_get_unmapped_area(filp, addr, len, pgoff, flags);
 }
 
 #else /* !CONFIG_MMU */
index 1074ac4459f2ca78e353755b1f635d28211c8110..872dc0e41c6570722e5d87613c979087085e265a 100644 (file)
@@ -334,7 +334,7 @@ static unsigned long arena_get_unmapped_area(struct file *filp, unsigned long ad
                        return -EINVAL;
        }
 
-       ret = mm_get_unmapped_area(current->mm, filp, addr, len * 2, 0, flags);
+       ret = mm_get_unmapped_area(filp, addr, len * 2, 0, flags);
        if (IS_ERR_VALUE(ret))
                return ret;
        if ((ret >> 32) == ((ret + len - 1) >> 32))
index 8a129746bd6cc77c3eea8ce5abd500f99a81326c..d77685f2c6cb43d77cfef0e42e35a7438f624800 100644 (file)
@@ -1162,7 +1162,7 @@ static unsigned long bpf_get_unmapped_area(struct file *filp, unsigned long addr
        if (map->ops->map_get_unmapped_area)
                return map->ops->map_get_unmapped_area(filp, addr, len, pgoff, flags);
 #ifdef CONFIG_MMU
-       return mm_get_unmapped_area(current->mm, filp, addr, len, pgoff, flags);
+       return mm_get_unmapped_area(filp, addr, len, pgoff, flags);
 #else
        return addr;
 #endif
index 2f2a521e5d68300e7f0965109dbab1837f419aae..32479ae2740057decd47ae6528b449a534f8a2f4 100644 (file)
@@ -1127,7 +1127,7 @@ static unsigned long __thp_get_unmapped_area(struct file *filp,
        if (len_pad < len || (off + len_pad) < off)
                return 0;
 
-       ret = mm_get_unmapped_area_vmflags(current->mm, filp, addr, len_pad,
+       ret = mm_get_unmapped_area_vmflags(filp, addr, len_pad,
                                           off >> PAGE_SHIFT, flags, vm_flags);
 
        /*
@@ -1164,7 +1164,7 @@ unsigned long thp_get_unmapped_area_vmflags(struct file *filp, unsigned long add
        if (ret)
                return ret;
 
-       return mm_get_unmapped_area_vmflags(current->mm, filp, addr, len, pgoff, flags,
+       return mm_get_unmapped_area_vmflags(filp, addr, len, pgoff, flags,
                                            vm_flags);
 }
 
index 5fd3b80fda1d5151c230321cb3228e935e4fa84b..644f02071a41b1ea24e69cf2ea4079dabc7267b7 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -797,12 +797,11 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
 }
 #endif
 
-unsigned long mm_get_unmapped_area_vmflags(struct mm_struct *mm, struct file *filp,
-                                          unsigned long addr, unsigned long len,
-                                          unsigned long pgoff, unsigned long flags,
-                                          vm_flags_t vm_flags)
+unsigned long mm_get_unmapped_area_vmflags(struct file *filp, unsigned long addr,
+                                          unsigned long len, unsigned long pgoff,
+                                          unsigned long flags, vm_flags_t vm_flags)
 {
-       if (mm_flags_test(MMF_TOPDOWN, mm))
+       if (mm_flags_test(MMF_TOPDOWN, current->mm))
                return arch_get_unmapped_area_topdown(filp, addr, len, pgoff,
                                                      flags, vm_flags);
        return arch_get_unmapped_area(filp, addr, len, pgoff, flags, vm_flags);
@@ -848,7 +847,7 @@ __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
                addr = thp_get_unmapped_area_vmflags(file, addr, len,
                                                     pgoff, flags, vm_flags);
        } else {
-               addr = mm_get_unmapped_area_vmflags(current->mm, file, addr, len,
+               addr = mm_get_unmapped_area_vmflags(file, addr, len,
                                                    pgoff, flags, vm_flags);
        }
        if (IS_ERR_VALUE(addr))
@@ -864,12 +863,10 @@ __get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
 }
 
 unsigned long
-mm_get_unmapped_area(struct mm_struct *mm, struct file *file,
-                    unsigned long addr, unsigned long len,
+mm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
                     unsigned long pgoff, unsigned long flags)
 {
-       return mm_get_unmapped_area_vmflags(mm, file, addr, len,
-                                           pgoff, flags, 0);
+       return mm_get_unmapped_area_vmflags(file, addr, len, pgoff, flags, 0);
 }
 EXPORT_SYMBOL(mm_get_unmapped_area);
 
index 58701d14dd96cd4aaf17f817c6a8eaa05086bfc9..0eecb486a0cb7f240a276f7e413e87e1622d6ab0 100644 (file)
@@ -2759,8 +2759,7 @@ unsigned long shmem_get_unmapped_area(struct file *file,
        if (len > TASK_SIZE)
                return -ENOMEM;
 
-       addr = mm_get_unmapped_area(current->mm, file, uaddr, len, pgoff,
-                                   flags);
+       addr = mm_get_unmapped_area(file, uaddr, len, pgoff, flags);
 
        if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE))
                return addr;
@@ -2838,8 +2837,7 @@ unsigned long shmem_get_unmapped_area(struct file *file,
        if (inflated_len < len)
                return addr;
 
-       inflated_addr = mm_get_unmapped_area(current->mm, NULL, uaddr,
-                                            inflated_len, 0, flags);
+       inflated_addr = mm_get_unmapped_area(NULL, uaddr, inflated_len, 0, flags);
        if (IS_ERR_VALUE(inflated_addr))
                return addr;
        if (inflated_addr & ~PAGE_MASK)
@@ -5775,7 +5773,7 @@ unsigned long shmem_get_unmapped_area(struct file *file,
                                      unsigned long addr, unsigned long len,
                                      unsigned long pgoff, unsigned long flags)
 {
-       return mm_get_unmapped_area(current->mm, file, addr, len, pgoff, flags);
+       return mm_get_unmapped_area(file, addr, len, pgoff, flags);
 }
 #endif