// Change the oldbrk of vma to the newbrk of the munmap area
vma_adjust_trans_huge(vma, vma->vm_start, newbrk, 0);
- if (vma->anon_vma) {
- anon_vma_lock_write(vma->anon_vma);
- anon_vma_interval_tree_pre_update_vma(vma);
- }
vma_mt_szero(vma->vm_mm, newbrk, vma->vm_end);
vma->vm_end = newbrk;
vmacache_invalidate(vma->vm_mm);
- if (vma->anon_vma) {
- anon_vma_interval_tree_post_update_vma(vma);
- anon_vma_unlock_write(vma->anon_vma);
- }
-
unmap_pages = vma_pages(&unmap);
if (unmap.vm_flags & VM_LOCKED) {
mm->locked_vm -= unmap_pages;
munlock_vma_pages_range(&unmap, newbrk, oldbrk);
}
- // prev of unmap_pages is just vma.
- if (vma->vm_flags & VM_GROWSUP)
- ret = 0;
- else if (vma->vm_next && (vma->vm_next->vm_flags & VM_GROWSDOWN))
- ret = 0;
-
- if (ret)
- mmap_write_downgrade(mm);
-
+ mmap_write_downgrade(mm);
unmap_region(mm, &unmap, vma, newbrk, oldbrk);
/* Statistics */
vm_stat_account(mm, unmap.vm_flags, -unmap_pages);
munmap_full_vma:
validate_mm_mt(mm);
- return ret;
+ return 1;
}
/*