• Brian Geffon's avatar
    mm: extend MREMAP_DONTUNMAP to non-anonymous mappings · a4609387
    Brian Geffon authored
    Patch series "mm: Extend MREMAP_DONTUNMAP to non-anonymous mappings", v5.
    
    This patch (of 3):
    
    Currently MREMAP_DONTUNMAP only accepts private anonymous mappings.  This
    restriction was placed initially for simplicity and not because there
    exists a technical reason to do so.
    
    This change will widen the support to include any mappings which are not
    VM_DONTEXPAND or VM_PFNMAP.  The primary use case is to support
    MREMAP_DONTUNMAP on mappings which may have been created from a memfd.
    This change will result in mremap(MREMAP_DONTUNMAP) returning -EINVAL if
    VM_DONTEXPAND or VM_PFNMAP mappings are specified.
    
    Lokesh Gidra who works on the Android JVM, provided an explanation of how
    such a feature will improve Android JVM garbage collection: "Android is
    developing a new garbage collector (GC), based on userfaultfd.  The
    garbage collector will use userfaultfd (uffd) on the java heap during
    compaction.  On accessing any uncompacted page, the application threads
    will find it missing, at which point the thread will create the compacted
    page and then use UFFDIO_COPY ioctl to get it mapped and then resume
    execution.  Before starting this compaction, in a stop-the-world pause the
    heap will be mremap(MREMAP_DONTUNMAP) so that the java heap is ready to
    receive UFFD_EVENT_PAGEFAULT events after resuming execution.
    
    To speedup mremap operations, pagetable movement was optimized by moving
    PUD entries instead of PTE entries [1].  It was necessary as mremap of
    even modest sized memory ranges also took several milliseconds, and
    stopping the application for that long isn't acceptable in response-time
    sensitive cases.
    
    With UFFDIO_CONTINUE feature [2], it will be even more efficient to
    implement this GC, particularly the 'non-moveable' portions of the heap.
    It will also help in reducing the need to copy (UFFDIO_COPY) the pages.
    However, for this to work, the java heap has to be on a 'shared' vma.
    Currently MREMAP_DONTUNMAP only supports private anonymous mappings, this
    patch will enable using UFFDIO_CONTINUE for the new userfaultfd-based heap
    compaction."
    
    [1] https://lore.kernel.org/linux-mm/20201215030730.NC3CU98e4%25akpm@linux-foundation.org/
    [2] https://lore.kernel.org/linux-mm/20210302000133.272579-1-axelrasmussen@google.com/
    
    Link: https://lkml.kernel.org/r/20210323182520.2712101-1-bgeffon@google.comSigned-off-by: default avatarBrian Geffon <bgeffon@google.com>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Tested-by: default avatarLokesh Gidra <lokeshgidra@google.com>
    Reviewed-by: default avatarDmitry Safonov <0x7f454c46@gmail.com>
    Cc: Alejandro Colomar <alx.manpages@gmail.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: "Kirill A . Shutemov" <kirill@shutemov.name>
    Cc: Michael Kerrisk <mtk.manpages@gmail.com>
    Cc: "Michael S . Tsirkin" <mst@redhat.com>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Sonny Rao <sonnyrao@google.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    a4609387
mremap.c 25.8 KB