From: Liam R. Howlett Date: Tue, 23 Feb 2021 16:23:44 +0000 (-0500) Subject: nommu: linked list fix X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=bfb2b3a3b314f2aba661dde7704f6d05f8f731ef;p=users%2Fjedix%2Flinux-maple.git nommu: linked list fix Signed-off-by: Liam R. Howlett --- diff --git a/mm/nommu.c b/mm/nommu.c index 7e2ea86d7b543..0260db903ab22 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -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)