]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
nommu: Remove uses of VMA linked list
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 29 Oct 2021 14:18:13 +0000 (10:18 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 1 Nov 2021 14:43:50 +0000 (10:43 -0400)
Use the maple tree or VMA iterator instead.  This is faster and will
allow us to shrink the VMA.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
mm/nommu.c

index 14f86bc582a8321105ffec9b9b52565bd9529a81..c2bf36dae3be0cf6f305e67afff5238de10d232e 100644 (file)
@@ -1371,6 +1371,7 @@ static int shrink_vma(struct mm_struct *mm,
  */
 int do_munmap(struct mm_struct *mm, unsigned long start, size_t len, struct list_head *uf)
 {
+       MA_STATE(mas, &mm->mm_mt, start, start);
        struct vm_area_struct *vma;
        unsigned long end;
        int ret;
@@ -1382,7 +1383,7 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len, struct list
        end = start + len;
 
        /* find the first potentially overlapping VMA */
-       vma = find_vma(mm, start);
+       vma = mas_find(&mas, end - 1);
        if (!vma) {
                static int limit;
                if (limit < 5) {
@@ -1401,7 +1402,7 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len, struct list
                                return -EINVAL;
                        if (end == vma->vm_end)
                                goto erase_whole_vma;
-                       vma = vma->vm_next;
+                       vma = mas_next(&mas, end - 1);
                } while (vma);
                return -EINVAL;
        } else {
@@ -1450,6 +1451,7 @@ SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
  */
 void exit_mmap(struct mm_struct *mm)
 {
+       VMA_ITERATOR(vmi, mm, 0);
        struct vm_area_struct *vma;
 
        if (!mm)
@@ -1457,12 +1459,14 @@ void exit_mmap(struct mm_struct *mm)
 
        mm->total_vm = 0;
 
-       while ((vma = mm->mmap)) {
-               mm->mmap = vma->vm_next;
+       mmap_write_lock(mm);
+       for_each_vma(vmi, vma) {
                delete_vma_from_mm(vma);
                delete_vma(mm, vma);
                cond_resched();
        }
+       __mt_destroy(&mm->mm_mt);
+       mmap_write_unlock(mm);
 }
 
 int vm_brk(unsigned long addr, unsigned long len)