While unmapping VMAs, adjacent VMAs might be able to grow into the area
being unmapped. In such cases write-lock adjacent VMAs to prevent this
growth.

Signed-off-by: Suren Baghdasaryan <sur...@google.com>
---
 mm/mmap.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/mm/mmap.c b/mm/mmap.c
index 0d767ce043af..30c7d1c5206e 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2461,11 +2461,13 @@ do_mas_align_munmap(struct ma_state *mas, struct 
vm_area_struct *vma,
         * down_read(mmap_lock) and collide with the VMA we are about to unmap.
         */
        if (downgrade) {
-               if (next && (next->vm_flags & VM_GROWSDOWN))
+               if (next && (next->vm_flags & VM_GROWSDOWN)) {
+                       vma_write_lock(next);
                        downgrade = false;
-               else if (prev && (prev->vm_flags & VM_GROWSUP))
+               } else if (prev && (prev->vm_flags & VM_GROWSUP)) {
+                       vma_write_lock(prev);
                        downgrade = false;
-               else
+               } else
                        mmap_write_downgrade(mm);
        }
 
-- 
2.39.0

Reply via email to