mm: use vma_iter_clear_gfp() in nommu
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Mon, 24 Jul 2023 18:31:51 +0000 (14:31 -0400)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 18 Aug 2023 17:12:49 +0000 (10:12 -0700)
Move the definition of vma_iter_clear_gfp() from mmap.c to internal.h so
it can be used in the nommu code.  This will reduce node preallocations
in nommu.

Link: https://lkml.kernel.org/r/20230724183157.3939892-10-Liam.Howlett@oracle.com
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Peng Zhang <zhangpeng.00@bytedance.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/internal.h
mm/mmap.c
mm/nommu.c

index 65f646c..2f35c0e 100644 (file)
@@ -1064,6 +1064,18 @@ static inline void vma_iter_clear(struct vma_iterator *vmi,
        mas_store_prealloc(&vmi->mas, NULL);
 }
 
+static inline int vma_iter_clear_gfp(struct vma_iterator *vmi,
+                       unsigned long start, unsigned long end, gfp_t gfp)
+{
+       vmi->mas.index = start;
+       vmi->mas.last = end - 1;
+       mas_store_gfp(&vmi->mas, NULL, gfp);
+       if (unlikely(mas_is_err(&vmi->mas)))
+               return -ENOMEM;
+
+       return 0;
+}
+
 static inline struct vm_area_struct *vma_iter_load(struct vma_iterator *vmi)
 {
        return mas_walk(&vmi->mas);
index 05e051f..1ddb024 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -154,18 +154,6 @@ static inline struct vm_area_struct *vma_prev_limit(struct vma_iterator *vmi,
        return mas_prev(&vmi->mas, min);
 }
 
-static inline int vma_iter_clear_gfp(struct vma_iterator *vmi,
-                       unsigned long start, unsigned long end, gfp_t gfp)
-{
-       vmi->mas.index = start;
-       vmi->mas.last = end - 1;
-       mas_store_gfp(&vmi->mas, NULL, gfp);
-       if (unlikely(mas_is_err(&vmi->mas)))
-               return -ENOMEM;
-
-       return 0;
-}
-
 /*
  * check_brk_limits() - Use platform specific check of range & verify mlock
  * limits.
index 9826f61..418cc06 100644 (file)
@@ -1396,17 +1396,13 @@ static int vmi_shrink_vma(struct vma_iterator *vmi,
 
        /* adjust the VMA's pointers, which may reposition it in the MM's tree
         * and list */
-       if (vma_iter_prealloc(vmi)) {
-               pr_warn("Allocation of vma tree for process %d failed\n",
-                      current->pid);
-               return -ENOMEM;
-       }
-
        if (from > vma->vm_start) {
-               vma_iter_clear(vmi, from, vma->vm_end);
+               if (vma_iter_clear_gfp(vmi, from, vma->vm_end, GFP_KERNEL))
+                       return -ENOMEM;
                vma->vm_end = from;
        } else {
-               vma_iter_clear(vmi, vma->vm_start, to);
+               if (vma_iter_clear_gfp(vmi, vma->vm_start, to, GFP_KERNEL))
+                       return -ENOMEM;
                vma->vm_start = to;
        }