From c88063128f0a725cea86a5dd67bab0f0e2842b55 Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Mon, 4 Jan 2021 15:13:14 -0500 Subject: [PATCH] mm: Introduce vma_next() and vma_prev() Rename internam vma_next() to _vma_next(). Signed-off-by: Liam R. Howlett --- include/linux/mm.h | 33 +++++++++++++++++++++++++++++++++ mm/mmap.c | 12 ++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 47626ea2fd22..f56bad25f4b3 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2655,6 +2655,24 @@ extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned lon extern struct vm_area_struct *find_vma_intersection(struct mm_struct *mm, unsigned long start_addr, unsigned long end_addr); +static inline struct vm_area_struct *vma_next(struct mm_struct *mm, + const struct vm_area_struct *vma) +{ + MA_STATE(mas, &mm->mm_mt, 0, 0); + + mas_set(&mas, vma->vm_end); + return mas_next(&mas, ULONG_MAX); +} + +static inline struct vm_area_struct *vma_prev(struct mm_struct *mm, + const struct vm_area_struct *vma) +{ + MA_STATE(mas, &mm->mm_mt, 0, 0); + + mas_set(&mas, vma->vm_start); + return mas_prev(&mas, 0); +} + static inline unsigned long vm_start_gap(struct vm_area_struct *vma) { unsigned long vm_start = vma->vm_start; @@ -2696,6 +2714,21 @@ static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm, return vma; } +static inline struct vm_area_struct *vma_mas_next(struct ma_state *mas) +{ + struct ma_state tmp; + + memcpy(&tmp, mas, sizeof(tmp)); + return mas_next(&tmp, ULONG_MAX); +} + +static inline struct vm_area_struct *vma_mas_prev(struct ma_state *mas) +{ + struct ma_state tmp; + + memcpy(&tmp, mas, sizeof(tmp)); + return mas_prev(&tmp, 0); +} static inline bool range_in_vma(struct vm_area_struct *vma, unsigned long start, unsigned long end) { diff --git a/mm/mmap.c b/mm/mmap.c index e75f2896dacd..fe02f3200c70 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -474,7 +474,7 @@ static bool range_has_overlap(struct mm_struct *mm, unsigned long start, } /* - * vma_next() - Get the next VMA. + * _vma_next() - Get the next VMA or the first. * @mm: The mm_struct. * @vma: The current vma. * @@ -482,7 +482,7 @@ static bool range_has_overlap(struct mm_struct *mm, unsigned long start, * * Returns: The next VMA after @vma. */ -static inline struct vm_area_struct *vma_next(struct mm_struct *mm, +static inline struct vm_area_struct *_vma_next(struct mm_struct *mm, struct vm_area_struct *vma) { if (!vma) @@ -1170,7 +1170,7 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm, if (vm_flags & VM_SPECIAL) return NULL; - next = vma_next(mm, prev); + next = _vma_next(mm, prev); area = next; if (area && area->vm_end == end) /* cases 6, 7, 8 */ next = next->vm_next; @@ -2351,7 +2351,7 @@ static void unmap_region(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev, unsigned long start, unsigned long end) { - struct vm_area_struct *next = vma_next(mm, prev); + struct vm_area_struct *next = _vma_next(mm, prev); struct mmu_gather tlb; lru_add_drain(); @@ -2503,7 +2503,7 @@ int do_mas_align_munmap(struct ma_state *mas, struct vm_area_struct *vma, if (error) return error; prev = vma; - vma = vma_next(mm, prev); + vma = _vma_next(mm, prev); mas->index = start; mas_reset(mas); } else { @@ -2520,7 +2520,7 @@ int do_mas_align_munmap(struct ma_state *mas, struct vm_area_struct *vma, int error = __split_vma(mm, last, end, 1); if (error) return error; - vma = vma_next(mm, prev); + vma = _vma_next(mm, prev); mas_reset(mas); } -- 2.50.1