From bfb2b3a3b314f2aba661dde7704f6d05f8f731ef Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Tue, 23 Feb 2021 11:23:44 -0500 Subject: [PATCH] nommu: linked list fix Signed-off-by: Liam R. Howlett --- mm/nommu.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/mm/nommu.c b/mm/nommu.c index 7e2ea86d7b54..0260db903ab2 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) -- 2.50.1