unsigned long vma_end = end;
long adj_next = 0;
unsigned long vma_start = addr;
- MA_STATE(mas, &mm->mm_mt, 0, 0);
+ MA_STATE(mas, &mm->mm_mt, vma_start, vma_start);
validate_mm(mm);
/*
if (vm_flags & VM_SPECIAL)
return NULL;
- next = find_vma(mm, prev ? prev->vm_end : 0);
- mid = next;
- if (next && next->vm_end == end) /* cases 6, 7, 8 */
- next = find_vma(mm, next->vm_end);
-
- /* verify some invariant that must be enforced by the caller */
- VM_WARN_ON(prev && addr <= prev->vm_start);
- VM_WARN_ON(mid && end > mid->vm_end);
- VM_WARN_ON(addr >= end);
-
if (prev) {
+ mas_set(&mas, prev->vm_end);
res = prev;
vma = prev;
vma_start = prev->vm_start;
merge_prev = true;
}
}
+
+ next = mas_find(&mas, end);
+ mid = next;
+ if (mid && mid->vm_end == end) /* cases 6, 7, 8 */
+ next = mas_find(&mas, end);
+
+ /* verify some invariant that must be enforced by the caller */
+ VM_WARN_ON(prev && addr <= prev->vm_start);
+ VM_WARN_ON(mid && end > mid->vm_end);
+ VM_WARN_ON(addr >= end);
+
/* Can we merge the successor? */
if (next && end == next->vm_start &&
mpol_equal(policy, vma_policy(next)) &&