mm: Introduce vma_next() and vma_prev()
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Mon, 4 Jan 2021 20:13:14 +0000 (15:13 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Thu, 28 Jan 2021 02:00:45 +0000 (21:00 -0500)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
include/linux/mm.h

index 47626ea2fd221773eacc5c9737317a70c7b41cb0..f56bad25f4b3a42225014b2435aae1274df58a59 100644 (file)
@@ -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)
 {