Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
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 {
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)