Commit 9ac09bb9 authored by Ryan Roberts's avatar Ryan Roberts Committed by Andrew Morton
Browse files

mm: consistently use current->mm in mm_get_unmapped_area()

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: default avatarRyan Roberts <ryan.roberts@arm.com>
Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarOscar Salvador <osalvador@suse.de>
Reviewed-by: default avatarDev Jain <dev.jain@arm.com>
Reviewed-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
Reviewed-by: default avatarLorenzo Stoakes <lorenzo.stoakes@oracle.com>
Reviewed-by: default avatarBaolin 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 0fdaa13e
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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;
}
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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 */
+2 −3
Original line number Diff line number Diff line
@@ -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 = {
+1 −2
Original line number Diff line number Diff line
@@ -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);
}

/*
Loading