• Axel Rasmussen's avatar
    userfaultfd/shmem: support UFFDIO_CONTINUE for shmem · 15313257
    Axel Rasmussen authored
    With this change, userspace can resolve a minor fault within a
    shmem-backed area with a UFFDIO_CONTINUE ioctl.  The semantics for this
    match those for hugetlbfs - we look up the existing page in the page
    cache, and install a PTE for it.
    
    This commit introduces a new helper: mfill_atomic_install_pte.
    
    Why handle UFFDIO_CONTINUE for shmem in mm/userfaultfd.c, instead of in
    shmem.c?  The existing userfault implementation only relies on shmem.c for
    VM_SHARED VMAs.  However, minor fault handling / CONTINUE work just fine
    for !VM_SHARED VMAs as well.  We'd prefer to handle CONTINUE for shmem in
    one place, regardless of shared/private (to reduce code duplication).
    
    Why add a new mfill_atomic_install_pte helper?  A problem we have with
    continue is that shmem_mfill_atomic_pte() and mcopy_atomic_pte() are
    *close* to what we want, but not exactly.  We do want to setup the PTEs in
    a CONTINUE operation, but we don't want to e.g.  allocate a new page,
    charge it (e.g.  to the shmem inode), manipulate various flags, etc.  Also
    we have the problem stated above: shmem_mfill_atomic_pte() and
    mcopy_atomic_pte() both handle one-half of the problem (shared / private)
    continue cares about.  So, introduce mcontinue_atomic_pte(), to handle all
    of the shmem continue cases.  Introduce the helper so it doesn't duplicate
    code with mcopy_atomic_pte().
    
    In a future commit, shmem_mfill_atomic_pte() will also be modified to use
    this new helper.  However, since this is a bigger refactor, it seems most
    clear to do it as a separate change.
    
    Link: https://lkml.kernel.org/r/20210503180737.2487560-5-axelrasmussen@google.comSigned-off-by: default avatarAxel Rasmussen <axelrasmussen@google.com>
    Acked-by: default avatarHugh Dickins <hughd@google.com>
    Acked-by: default avatarPeter Xu <peterx@redhat.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>
    15313257
userfaultfd.c 17.8 KB