• Axel Rasmussen's avatar
    userfaultfd/shmem: combine shmem_{mcopy_atomic,mfill_zeropage}_pte · 3460f6e5
    Axel Rasmussen authored
    Patch series "userfaultfd: add minor fault handling for shmem", v6.
    
    Overview
    ========
    
    See the series which added minor faults for hugetlbfs [3] for a detailed
    overview of minor fault handling in general.  This series adds the same
    support for shmem-backed areas.
    
    This series is structured as follows:
    
    - Commits 1 and 2 are cleanups.
    - Commits 3 and 4 implement the new feature (minor fault handling for shmem).
    - Commit 5 advertises that the feature is now available since at this point it's
      fully implemented.
    - Commit 6 is a final cleanup, modifying an existing code path to re-use a new
      helper we've introduced.
    - Commits 7, 8, 9, 10 update the userfaultfd selftest to exercise the feature.
    
    Use Case
    ========
    
    In some cases it is useful to have VM memory backed by tmpfs instead of
    hugetlbfs.  So, this feature will be used to support the same VM live
    migration use case described in my original series.
    
    Additionally, Android folks (Lokesh Gidra <lokeshgidra@google.com>) hope
    to optimize the Android Runtime garbage collector using this feature:
    
    "The plan is to use userfaultfd for concurrently compacting the heap.
    With this feature, the heap can be shared-mapped at another location where
    the GC-thread(s) could continue the compaction operation without the need
    to invoke userfault ioctl(UFFDIO_COPY) each time.  OTOH, if and when Java
    threads get faults on the heap, UFFDIO_CONTINUE can be used to resume
    execution.  Furthermore, this feature enables updating references in the
    'non-moving' portion of the heap efficiently.  Without this feature,
    uneccessary page copying (ioctl(UFFDIO_COPY)) would be required."
    
    [1] https://lore.kernel.org/patchwork/cover/1388144/
    [2] https://lore.kernel.org/patchwork/patch/1408161/
    [3] https://lore.kernel.org/linux-fsdevel/20210301222728.176417-1-axelrasmussen@google.com/T/#t
    
    This patch (of 9):
    
    Previously, we did a dance where we had one calling path in userfaultfd.c
    (mfill_atomic_pte), but then we split it into two in shmem_fs.h
    (shmem_{mcopy_atomic,mfill_zeropage}_pte), and then rejoined into a single
    shared function in shmem.c (shmem_mfill_atomic_pte).
    
    This is all a bit overly complex.  Just call the single combined shmem
    function directly, allowing us to clean up various branches, boilerplate,
    etc.
    
    While we're touching this function, two other small cleanup changes:
    - offset is equivalent to pgoff, so we can get rid of offset entirely.
    - Split two VM_BUG_ON cases into two statements. This means the line
      number reported when the BUG is hit specifies exactly which condition
      was true.
    
    Link: https://lkml.kernel.org/r/20210503180737.2487560-1-axelrasmussen@google.com
    Link: https://lkml.kernel.org/r/20210503180737.2487560-3-axelrasmussen@google.comSigned-off-by: default avatarAxel Rasmussen <axelrasmussen@google.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Brian Geffon <bgeffon@google.com>
    Cc: "Dr . David Alan Gilbert" <dgilbert@redhat.com>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: Joe Perches <joe@perches.com>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Lokesh Gidra <lokeshgidra@google.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    Cc: Mina Almasry <almasrymina@google.com>
    Cc: Oliver Upton <oupton@google.com>
    Cc: Shaohua Li <shli@fb.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Cc: Wang Qing <wangqing@vivo.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3460f6e5
shmem.c 109 KB