Skip to content
  • Brian Geffon's avatar
    mm/mremap: add MREMAP_DONTUNMAP to mremap() · e346b381
    Brian Geffon authored
    When remapping an anonymous, private mapping, if MREMAP_DONTUNMAP is set,
    the source mapping will not be removed.  The remap operation will be
    performed as it would have been normally by moving over the page tables to
    the new mapping.  The old vma will have any locked flags cleared, have no
    pagetables, and any userfaultfds that were watching that range will
    continue watching it.
    
    For a mapping that is shared or not anonymous, MREMAP_DONTUNMAP will cause
    the mremap() call to fail.  Because MREMAP_DONTUNMAP always results in
    moving a VMA you MUST use the MREMAP_MAYMOVE flag, it's not possible to
    resize a VMA while also moving with MREMAP_DONTUNMAP so old_len must
    always be equal to the new_len otherwise it will return -EINVAL.
    
    We hope to use this in Chrome OS where with userfaultfd we could write an
    anonymous mapping to disk without having to STOP the process or worry
    about VMA permission changes.
    
    This feature also has a use case in Android, Lokesh Gidra has said that
    "As part of using userfaultfd for GC, We'll have to move the physical
    pages of the java heap to a separate location.  For this purpose mremap
    will be used.  Without the MREMAP_DONTUNMAP flag, when I mremap the java
    heap, its virtual mapping will be removed as well.  Therefore, we'll
    require performing mmap immediately after.  This is not only time
    consuming but also opens a time window where a native thread may call mmap
    and reserve the java heap's address range for its own usage.  This flag
    solves the problem."
    
    [bgeffon@google.com: v6]
      Link: http://lkml.kernel.org/r/20200218173221.237674-1-bgeffon@google.com
    [bgeffon@google.com: v7]
      Link: http://lkml.kernel.org/r/20200221174248.244748-1-bgeffon@google.com
    
    
    Signed-off-by: default avatarBrian Geffon <bgeffon@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Tested-by: default avatarLokesh Gidra <lokeshgidra@google.com>
    Reviewed-by: default avatarMinchan Kim <minchan@kernel.org>
    Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: "Michael S . Tsirkin" <mst@redhat.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Will Deacon <will@kernel.org>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Sonny Rao <sonnyrao@google.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Joel Fernandes <joel@joelfernandes.org>
    Cc: Yu Zhao <yuzhao@google.com>
    Cc: Jesse Barnes <jsbarnes@google.com>
    Cc: Nathan Chancellor <natechancellor@gmail.com>
    Cc: Florian Weimer <fweimer@redhat.com>
    Link: http://lkml.kernel.org/r/20200207201856.46070-1-bgeffon@google.com
    
    
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e346b381