vma_expand changes VMA boundaries and might result in freeing an adjacent
VMA. Write-lock affected VMAs to prevent concurrent page faults.

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

diff --git a/mm/mmap.c b/mm/mmap.c
index 1e2154137631..ff02cb51e7e7 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -544,6 +544,7 @@ inline int vma_expand(struct ma_state *mas, struct 
vm_area_struct *vma,
        if (mas_preallocate(mas, vma, GFP_KERNEL))
                goto nomem;
 
+       vma_write_lock(vma);
        vma_adjust_trans_huge(vma, start, end, 0);
 
        if (file) {
@@ -590,6 +591,7 @@ inline int vma_expand(struct ma_state *mas, struct 
vm_area_struct *vma,
        }
 
        if (remove_next) {
+               vma_write_lock(next);
                if (file) {
                        uprobe_munmap(next, next->vm_start, next->vm_end);
                        fput(file);
-- 
2.39.0

Reply via email to