lkml.org 
[lkml]   [2020]   [Oct]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/6] mremap: Check if it's possible to split original vma
    Date
    If original VMA can't be split at the desired address, do_munmap() will
    fail and leave both new-copied VMA and old VMA. De-facto it's
    MREMAP_DONTUNMAP behaviour, which is unexpected.

    Currently, it may fail such way for hugetlbfs and dax device mappings.

    Minimize such unpleasant situations to OOM by checking .may_split()
    before attempting to create a VMA copy.

    Signed-off-by: Dmitry Safonov <dima@arista.com>
    ---
    mm/mremap.c | 11 ++++++++++-
    1 file changed, 10 insertions(+), 1 deletion(-)

    diff --git a/mm/mremap.c b/mm/mremap.c
    index 898e9818ba6d..3c4047c23673 100644
    --- a/mm/mremap.c
    +++ b/mm/mremap.c
    @@ -343,7 +343,7 @@ static unsigned long move_vma(struct vm_area_struct *vma,
    unsigned long excess = 0;
    unsigned long hiwater_vm;
    int split = 0;
    - int err;
    + int err = 0;
    bool need_rmap_locks;

    /*
    @@ -353,6 +353,15 @@ static unsigned long move_vma(struct vm_area_struct *vma,
    if (mm->map_count >= sysctl_max_map_count - 3)
    return -ENOMEM;

    + if (vma->vm_ops && vma->vm_ops->may_split) {
    + if (vma->vm_start != old_addr)
    + err = vma->vm_ops->may_split(vma, old_addr);
    + if (!err && vma->vm_end != old_addr + old_len)
    + err = vma->vm_ops->may_split(vma, old_addr + old_len);
    + if (err)
    + return err;
    + }
    +
    /*
    * Advise KSM to break any KSM pages in the area to be moved:
    * it would be confusing if they were to turn up at the new
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-10-13 03:35    [W:6.862 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site