[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 04/13] mm: update generic_get_unmapped_area[_topdown]() to use vma_flags_t



As part of the changes converting VMA flags from a system word size to a
bitmap, extend this change to generic_get_unmapped_area() and
generic_get_unmapped_area_topdown(), which also allows us to convert
stack_guard_placement() as well.

We retain arch_get_unmapped_area() and arch_get_unmapped_area_topdown()
as-is for now, using legacy_to_vma_flags() as necessary to do so.

No functional change intended.

Signed-off-by: Lorenzo Stoakes <ljs@xxxxxxxxxx>
---
 arch/powerpc/mm/book3s64/slice.c |  6 ++++--
 include/linux/sched/mm.h         |  4 ++--
 mm/mmap.c                        | 16 ++++++++--------
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/arch/powerpc/mm/book3s64/slice.c b/arch/powerpc/mm/book3s64/slice.c
index 28bec5bc7879..82127e31dca6 100644
--- a/arch/powerpc/mm/book3s64/slice.c
+++ b/arch/powerpc/mm/book3s64/slice.c
@@ -659,7 +659,8 @@ unsigned long arch_get_unmapped_area(struct file *filp,
        unsigned int psize;
 
        if (radix_enabled())
-               return generic_get_unmapped_area(filp, addr, len, pgoff, flags, 
vm_flags);
+               return generic_get_unmapped_area(filp, addr, len, pgoff, flags,
+                                                legacy_to_vma_flags(vm_flags));
 
        if (filp && is_file_hugepages(filp))
                psize = file_to_psize(filp);
@@ -679,7 +680,8 @@ unsigned long arch_get_unmapped_area_topdown(struct file 
*filp,
        unsigned int psize;
 
        if (radix_enabled())
-               return generic_get_unmapped_area_topdown(filp, addr0, len, 
pgoff, flags, vm_flags);
+               return generic_get_unmapped_area_topdown(filp, addr0, len,
+                               pgoff, flags, legacy_to_vma_flags(vm_flags));
 
        if (filp && is_file_hugepages(filp))
                psize = file_to_psize(filp);
diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h
index b301ec90740a..c8720d8e2158 100644
--- a/include/linux/sched/mm.h
+++ b/include/linux/sched/mm.h
@@ -203,11 +203,11 @@ unsigned long mm_get_unmapped_area_vmaflags(struct file 
*filp,
 unsigned long
 generic_get_unmapped_area(struct file *filp, unsigned long addr,
                          unsigned long len, unsigned long pgoff,
-                         unsigned long flags, vm_flags_t vm_flags);
+                         unsigned long flags, vma_flags_t vma_flags);
 unsigned long
 generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
                                  unsigned long len, unsigned long pgoff,
-                                 unsigned long flags, vm_flags_t vm_flags);
+                                 unsigned long flags, vma_flags_t vma_flags);
 #else
 static inline void arch_pick_mmap_layout(struct mm_struct *mm,
                                         const struct rlimit *rlim_stack) {}
diff --git a/mm/mmap.c b/mm/mmap.c
index 461ce510e12a..3ef603d5ff00 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -657,9 +657,9 @@ SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, 
arg)
  * Determine if the allocation needs to ensure that there is no
  * existing mapping within it's guard gaps, for use as start_gap.
  */
-static inline unsigned long stack_guard_placement(vm_flags_t vm_flags)
+static inline unsigned long stack_guard_placement(vma_flags_t vma_flags)
 {
-       if (vm_flags & VM_SHADOW_STACK)
+       if (vma_flags_test_single_mask(&vma_flags, VMA_SHADOW_STACK))
                return PAGE_SIZE;
 
        return 0;
@@ -701,7 +701,7 @@ unsigned long vm_unmapped_area(struct vm_unmapped_area_info 
*info)
 unsigned long
 generic_get_unmapped_area(struct file *filp, unsigned long addr,
                          unsigned long len, unsigned long pgoff,
-                         unsigned long flags, vm_flags_t vm_flags)
+                         unsigned long flags, vma_flags_t vma_flags)
 {
        struct mm_struct *mm = current->mm;
        struct vm_area_struct *vma, *prev;
@@ -726,7 +726,7 @@ generic_get_unmapped_area(struct file *filp, unsigned long 
addr,
        info.length = len;
        info.low_limit = mm->mmap_base;
        info.high_limit = mmap_end;
-       info.start_gap = stack_guard_placement(vm_flags);
+       info.start_gap = stack_guard_placement(vma_flags);
        if (filp && is_file_hugepages(filp))
                info.align_mask = huge_page_mask_align(filp);
        return vm_unmapped_area(&info);
@@ -739,7 +739,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long 
addr,
                       unsigned long flags, vm_flags_t vm_flags)
 {
        return generic_get_unmapped_area(filp, addr, len, pgoff, flags,
-                                        vm_flags);
+                                        legacy_to_vma_flags(vm_flags));
 }
 #endif
 
@@ -750,7 +750,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long 
addr,
 unsigned long
 generic_get_unmapped_area_topdown(struct file *filp, unsigned long addr,
                                  unsigned long len, unsigned long pgoff,
-                                 unsigned long flags, vm_flags_t vm_flags)
+                                 unsigned long flags, vma_flags_t vma_flags)
 {
        struct vm_area_struct *vma, *prev;
        struct mm_struct *mm = current->mm;
@@ -778,7 +778,7 @@ generic_get_unmapped_area_topdown(struct file *filp, 
unsigned long addr,
        info.length = len;
        info.low_limit = PAGE_SIZE;
        info.high_limit = arch_get_mmap_base(addr, mm->mmap_base);
-       info.start_gap = stack_guard_placement(vm_flags);
+       info.start_gap = stack_guard_placement(vma_flags);
        if (filp && is_file_hugepages(filp))
                info.align_mask = huge_page_mask_align(filp);
        addr = vm_unmapped_area(&info);
@@ -807,7 +807,7 @@ arch_get_unmapped_area_topdown(struct file *filp, unsigned 
long addr,
                               unsigned long flags, vm_flags_t vm_flags)
 {
        return generic_get_unmapped_area_topdown(filp, addr, len, pgoff, flags,
-                                                vm_flags);
+                                                legacy_to_vma_flags(vm_flags));
 }
 #endif
 
-- 
2.54.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.