From: Suren Baghdasaryan Date: Wed, 19 Oct 2022 20:12:19 +0000 (+0000) Subject: mm: perform VMA walk in find_mergeable_anon_vma under RCU read lock X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d3f6a897b96314e6e3b63f254bcbf5963dbbbb0c;p=users%2Fjedix%2Flinux-maple.git mm: perform VMA walk in find_mergeable_anon_vma under RCU read lock 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 --- diff --git a/mm/mmap.c b/mm/mmap.c index 5e2193f59a8d..ee8dc559a66c 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1169,12 +1169,20 @@ struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *vma) 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); @@ -1184,6 +1192,7 @@ struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *vma) 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.