]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
nommu: linked list fix
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 23 Feb 2021 16:23:44 +0000 (11:23 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 23 Feb 2021 16:23:44 +0000 (11:23 -0500)
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
mm/nommu.c

index 7e2ea86d7b54355d480180e2abef9b9d7fc8c0cd..0260db903ab22b960e030a943f7b1b9e9e4f21f0 100644 (file)
@@ -1483,7 +1483,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_next(vma);
+                       vma = vma_next(mm, vma);
                } while (vma);
                return -EINVAL;
        } else {
@@ -1534,18 +1534,23 @@ SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
 void exit_mmap(struct mm_struct *mm)
 {
        struct vm_area_struct *vma;
+       MA_STATE(mas, NULL, 0, 0);
 
        if (!mm)
                return;
 
+       mas.tree = &mm->mm_mt;
        mm->total_vm = 0;
-
-       while ((vma = mm->mmap)) {
-               mm->mmap = vma_next(vma);
+       rcu_read_lock();
+       mas_for_each(&mas, vma, ULONG_MAX) {
                delete_vma_from_mm(vma);
                delete_vma(mm, vma);
+               rcu_read_unlock();
+               mas_pause(&mas);
                cond_resched();
+               rcu_read_lock();
        }
+       rcu_read_unlock();
 }
 
 int vm_brk(unsigned long addr, unsigned long len)