EXPORT_SYMBOL(find_vma);
/**
- * mt_find_vma_prev() - Find the VMA for a given address, or the next vma and
+ * find_vma_prev() - Find the VMA for a given address, or the next vma and
* sets %pprev to the previous VMA, if any.
* @mm The mm_struct to check
* @addr: The address
* May return NULL in the case of no vma at addr or above.
*/
struct vm_area_struct *
-mt_find_vma_prev(struct mm_struct *mm, unsigned long addr,
- struct vm_area_struct **pprev)
+find_vma_prev(struct mm_struct *mm, unsigned long addr,
+ struct vm_area_struct **pprev)
{
struct vm_area_struct *vma;
MA_STATE(mas, &mm->mm_mt, addr, addr);
rcu_read_lock();
vma = mas_find(&mas, ULONG_MAX);
+ if (!vma)
+ mas_reset(&mas);
+
*pprev = mas_prev(&mas, 0);
rcu_read_unlock();
return vma;
}
-/*
- * Same as find_vma, but also return a pointer to the previous VMA in *pprev.
- */
-struct vm_area_struct *
-rb_find_vma_prev(struct mm_struct *mm, unsigned long addr,
- struct vm_area_struct **pprev)
-{
- struct vm_area_struct *vma;
-
- vma = find_vma(mm, addr);
- if (vma) {
- *pprev = vma->vm_prev;
- } else {
- struct rb_node *rb_node = rb_last(&mm->mm_rb);
-
- *pprev = rb_node ? rb_entry(rb_node, struct vm_area_struct, vm_rb) : NULL;
- }
- return vma;
-}
-
-struct vm_area_struct *
-find_vma_prev(struct mm_struct *mm, unsigned long addr,
- struct vm_area_struct **pprev)
-{
- struct vm_area_struct *mt_prev;
- struct vm_area_struct *ret = rb_find_vma_prev(mm, addr, pprev);
- VM_BUG_ON_VMA((unsigned long)ret !=
- (unsigned long)mt_find_vma_prev(mm, addr, &mt_prev),
- ret);
- VM_BUG_ON_VMA(mt_prev != *pprev, *pprev);
- return ret;
-}
-
/*
* Verify that the stack growth is acceptable and
* update accounting. This is shared with both the