• Axel Rasmussen's avatar
    userfaultfd/selftests: add test exercising minor fault handling · f0fa9433
    Axel Rasmussen authored
    Fix a dormant bug in userfaultfd_events_test(), where we did `return
    faulting_process(0)` instead of `exit(faulting_process(0))`.  This
    caused the forked process to keep running, trying to execute any further
    test cases after the events test in parallel with the "real" process.
    
    Add a simple test case which exercises minor faults.  In short, it does
    the following:
    
    1. "Sets up" an area (area_dst) and a second shared mapping to the same
       underlying pages (area_dst_alias).
    
    2. Register one of these areas with userfaultfd, in minor fault mode.
    
    3. Start a second thread to handle any minor faults.
    
    4. Populate the underlying pages with the non-UFFD-registered side of
       the mapping. Basically, memset() each page with some arbitrary
       contents.
    
    5. Then, using the UFFD-registered mapping, read all of the page
       contents, asserting that the contents match expectations (we expect
       the minor fault handling thread can modify the page contents before
       resolving the fault).
    
    The minor fault handling thread, upon receiving an event, flips all the
    bits (~) in that page, just to prove that it can modify it in some
    arbitrary way.  Then it issues a UFFDIO_CONTINUE ioctl, to setup the
    mapping and resolve the fault.  The reading thread should wake up and
    see this modification.
    
    Currently the minor fault test is only enabled in hugetlb_shared mode,
    as this is the only configuration the kernel feature supports.
    
    Link: https://lkml.kernel.org/r/20210301222728.176417-7-axelrasmussen@google.comSigned-off-by: default avatarAxel Rasmussen <axelrasmussen@google.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Cc: Adam Ruprecht <ruprecht@google.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Cannon Matthews <cannonmatthews@google.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Chinwen Chang <chinwen.chang@mediatek.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: "Dr . David Alan Gilbert" <dgilbert@redhat.com>
    Cc: Huang Ying <ying.huang@intel.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Lokesh Gidra <lokeshgidra@google.com>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: "Michal Koutn" <mkoutny@suse.com>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Mike Rapoport <rppt@linux.vnet.ibm.com>
    Cc: Mina Almasry <almasrymina@google.com>
    Cc: Nicholas Piggin <npiggin@gmail.com>
    Cc: Oliver Upton <oupton@google.com>
    Cc: Shaohua Li <shli@fb.com>
    Cc: Shawn Anastasio <shawn@anastas.io>
    Cc: Steven Price <steven.price@arm.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    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>
    f0fa9433
userfaultfd.c 42.3 KB