mm: use vma_iter_clear_gfp() in nommu

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>
This commit is contained in:
Liam R. Howlett 2023-07-24 14:31:51 -04:00 committed by Andrew Morton
parent c108df767f
commit f72cf24a86
3 changed files with 16 additions and 20 deletions

View 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);

View File

@ -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.

View 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;
}