|
@@ -906,14 +906,7 @@ struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *vma)
|
|
if (anon_vma)
|
|
if (anon_vma)
|
|
return anon_vma;
|
|
return anon_vma;
|
|
try_prev:
|
|
try_prev:
|
|
- /*
|
|
|
|
- * It is potentially slow to have to call find_vma_prev here.
|
|
|
|
- * But it's only on the first write fault on the vma, not
|
|
|
|
- * every time, and we could devise a way to avoid it later
|
|
|
|
- * (e.g. stash info in next's anon_vma_node when assigning
|
|
|
|
- * an anon_vma, or when trying vma_merge). Another time.
|
|
|
|
- */
|
|
|
|
- BUG_ON(find_vma_prev(vma->vm_mm, vma->vm_start, &near) != vma);
|
|
|
|
|
|
+ near = vma->vm_prev;
|
|
if (!near)
|
|
if (!near)
|
|
goto none;
|
|
goto none;
|
|
|
|
|
|
@@ -2044,9 +2037,10 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
/* Find the first overlapping VMA */
|
|
/* Find the first overlapping VMA */
|
|
- vma = find_vma_prev(mm, start, &prev);
|
|
|
|
|
|
+ vma = find_vma(mm, start);
|
|
if (!vma)
|
|
if (!vma)
|
|
return 0;
|
|
return 0;
|
|
|
|
+ prev = vma->vm_prev;
|
|
/* we have start < vma->vm_end */
|
|
/* we have start < vma->vm_end */
|
|
|
|
|
|
/* if it doesn't overlap, we have nothing.. */
|
|
/* if it doesn't overlap, we have nothing.. */
|