It looks safe to release mmap_sem in the middle for vm_munmap and brk,
so passing "false" to do_munmap() call.
However it sounds not safe to mmap_region() which is called by
SyS_mmap().

Signed-off-by: Yang Shi <yang....@linux.alibaba.com>
---
 mm/mmap.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mm/mmap.c b/mm/mmap.c
index ad6ae7a..374e4ec 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -225,7 +225,7 @@ static struct vm_area_struct *remove_vma(struct 
vm_area_struct *vma)
 
        /* Always allow shrinking brk. */
        if (brk <= mm->brk) {
-               if (!do_munmap(mm, newbrk, oldbrk-newbrk, &uf))
+               if (!do_munmap(mm, newbrk, oldbrk-newbrk, &uf, false))
                        goto set_brk;
                goto out;
        }
@@ -1643,7 +1643,7 @@ unsigned long mmap_region(struct file *file, unsigned 
long addr,
        /* Clear old maps */
        while (find_vma_links(mm, addr, addr + len, &prev, &rb_link,
                              &rb_parent)) {
-               if (do_munmap(mm, addr, len, uf))
+               if (do_munmap(mm, addr, len, uf, true))
                        return -ENOMEM;
        }
 
@@ -2778,7 +2778,7 @@ int vm_munmap(unsigned long start, size_t len)
        if (down_write_killable(&mm->mmap_sem))
                return -EINTR;
 
-       ret = do_munmap(mm, start, len, &uf);
+       ret = do_munmap(mm, start, len, &uf, false);
        up_write(&mm->mmap_sem);
        userfaultfd_unmap_complete(mm, &uf);
        return ret;
@@ -2945,7 +2945,7 @@ static int do_brk_flags(unsigned long addr, unsigned long 
request, unsigned long
         */
        while (find_vma_links(mm, addr, addr + len, &prev, &rb_link,
                              &rb_parent)) {
-               if (do_munmap(mm, addr, len, uf))
+               if (do_munmap(mm, addr, len, uf, false))
                        return -ENOMEM;
        }
 
-- 
1.8.3.1

Reply via email to