[RESEND PATCH v4 1/8] mm: Add arch_get_mmap_base_topdown macro

From: Amanieu d'Antras
Date: Tue May 18 2021 - 05:07:53 EST


This allows architectures to customize the mmap base to use depending on
the direction of allocation.

The base argument is also removed from arch_get_mmap_base[_topdown] in
prepartion for future changes.

arm64 is currently the only user of the arch_get_mmap_* macros and is
adjusted accordingly. Specifically it only needs to limit the upper
bound of VM allocations and therefore only needs to customize
arch_get_mmap_base_topdown but not arch_get_mmap_base.

Signed-off-by: Amanieu d'Antras <amanieu@xxxxxxxxx>
Co-developed-by: Ryan Houdek <Houdek.Ryan@xxxxxxxxxxx>
Signed-off-by: Ryan Houdek <Houdek.Ryan@xxxxxxxxxxx>
---
arch/arm64/include/asm/processor.h | 7 ++++---
mm/mmap.c | 14 +++++++++-----
2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
index efc10e9041a0..f47528aae321 100644
--- a/arch/arm64/include/asm/processor.h
+++ b/arch/arm64/include/asm/processor.h
@@ -88,9 +88,10 @@
#define arch_get_mmap_end(addr) ((addr > DEFAULT_MAP_WINDOW) ? TASK_SIZE :\
DEFAULT_MAP_WINDOW)

-#define arch_get_mmap_base(addr, base) ((addr > DEFAULT_MAP_WINDOW) ? \
- base + TASK_SIZE - DEFAULT_MAP_WINDOW :\
- base)
+#define arch_get_mmap_base_topdown(addr) \
+ ((addr > DEFAULT_MAP_WINDOW) ? \
+ current->mm->mmap_base + TASK_SIZE - DEFAULT_MAP_WINDOW :\
+ current->mm->mmap_base)
#endif /* CONFIG_ARM64_FORCE_52BIT */

extern phys_addr_t arm64_dma_phys_limit;
diff --git a/mm/mmap.c b/mm/mmap.c
index 3f287599a7a3..4937b34085cb 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2139,11 +2139,15 @@ unsigned long vm_unmapped_area(struct vm_unmapped_area_info *info)
}

#ifndef arch_get_mmap_end
-#define arch_get_mmap_end(addr) (TASK_SIZE)
+#define arch_get_mmap_end(addr) (TASK_SIZE)
#endif

#ifndef arch_get_mmap_base
-#define arch_get_mmap_base(addr, base) (base)
+#define arch_get_mmap_base(addr) (current->mm->mmap_base)
+#endif
+
+#ifndef arch_get_mmap_base_topdown
+#define arch_get_mmap_base_topdown(addr) (current->mm->mmap_base)
#endif

/* Get an address range which is currently unmapped.
@@ -2184,7 +2188,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,

info.flags = 0;
info.length = len;
- info.low_limit = mm->mmap_base;
+ info.low_limit = arch_get_mmap_base(addr);
info.high_limit = mmap_end;
info.align_mask = 0;
info.align_offset = 0;
@@ -2227,7 +2231,7 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
info.length = len;
info.low_limit = max(PAGE_SIZE, mmap_min_addr);
- info.high_limit = arch_get_mmap_base(addr, mm->mmap_base);
+ info.high_limit = arch_get_mmap_base_topdown(addr);
info.align_mask = 0;
info.align_offset = 0;
addr = vm_unmapped_area(&info);
@@ -2241,7 +2245,7 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
if (offset_in_page(addr)) {
VM_BUG_ON(addr != -ENOMEM);
info.flags = 0;
- info.low_limit = TASK_UNMAPPED_BASE;
+ info.low_limit = arch_get_mmap_base(addr);
info.high_limit = mmap_end;
addr = vm_unmapped_area(&info);
}
--
2.31.1