find_mergeable_anon_vma walks VMA tree unders assumption that the caller
holds mmap_lock for write. Perform this walk under RCU protection to make
it safe without holding this lock.
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
struct anon_vma *anon_vma = NULL;
struct vm_area_struct *prev, *next;
+ /*
+ * This search can be done with per-vma lock and without mmap_lock,
+ * therefore acquire RCU read lock to prevent the tree from changing.
+ */
+ rcu_read_lock();
+
/* Try next first. */
next = mas_walk(&mas);
if (next) {
anon_vma = reusable_anon_vma(next, vma, next);
- if (anon_vma)
+ if (anon_vma) {
+ rcu_read_unlock();
return anon_vma;
+ }
}
prev = mas_prev(&mas, 0);
if (prev)
anon_vma = reusable_anon_vma(prev, prev, vma);
+ rcu_read_unlock();
/*
* We might reach here with anon_vma == NULL if we can't find
* any reusable anon_vma.