From: "Mike Rapoport (Microsoft)" <[email protected]> Hi,
These patches enable support for userfaultfd in guest_memfd. As the ground work I refactored userfaultfd handling of PTE-based memory types (anonymous and shmem) and converted them to use vm_uffd_ops for allocating a folio or getting an existing folio from the page cache. shmem also implements callbacks that add a folio to the page cache after the data passed in UFFDIO_COPY was copied and remove the folio from the page cache if page table update fails. In order for guest_memfd to notify userspace about page faults, there are new VM_FAULT_UFFD_MINOR and VM_FAULT_UFFD_MISSING that a ->fault() handler can return to inform the page fault handler that it needs to call handle_userfault() to complete the fault. Nikita helped to plumb these new goodies into guest_memfd and provided basic tests to verify that guest_memfd works with userfaultfd. The handling of UFFDIO_MISSING in guest_memfd requires ability to remove a folio from page cache, the best way I could find was exporting filemap_remove_folio() to KVM. I deliberately left hugetlb out, at least for the most part. hugetlb handles acquisition of VMA and more importantly establishing of parent page table entry differently than PTE-based memory types. This is a different abstraction level than what vm_uffd_ops provides and people objected to exposing such low level APIs as a part of VMA operations. Also, to enable uffd in guest_memfd refactoring of hugetlb is not needed and I prefer to delay it until the dust settles after the changes in this set. v1 changes: * instead of returning uffd-specific values from ->fault() handlers add __do_userfault() helper to resolve user faults in __do_fault() * address comments from Peter * rebased on v7.0-c1 RFC: https://lore.kernel.org/all/[email protected] Mike Rapoport (Microsoft) (11): userfaultfd: introduce mfill_copy_folio_locked() helper userfaultfd: introduce struct mfill_state userfaultfd: introduce mfill_get_pmd() helper. userfaultfd: introduce mfill_get_vma() and mfill_put_vma() userfaultfd: retry copying with locks dropped in mfill_atomic_pte_copy() userfaultfd: move vma_can_userfault out of line userfaultfd: introduce vm_uffd_ops shmem, userfaultfd: use a VMA callback to handle UFFDIO_CONTINUE userfaultfd: introduce vm_uffd_ops->alloc_folio() shmem, userfaultfd: implement shmem uffd operations using vm_uffd_ops userfaultfd: mfill_atomic(): remove retry logic Nikita Kalyazin (3): KVM: guest_memfd: implement userfaultfd operations KVM: selftests: test userfaultfd minor for guest_memfd KVM: selftests: test userfaultfd missing for guest_memfd Peter Xu (1): mm: generalize handling of userfaults in __do_fault() include/linux/mm.h | 5 + include/linux/shmem_fs.h | 14 - include/linux/userfaultfd_k.h | 73 +- mm/filemap.c | 1 + mm/hugetlb.c | 15 + mm/memory.c | 43 ++ mm/shmem.c | 188 ++--- mm/userfaultfd.c | 692 ++++++++++-------- .../testing/selftests/kvm/guest_memfd_test.c | 191 +++++ virt/kvm/guest_memfd.c | 84 ++- 10 files changed, 858 insertions(+), 448 deletions(-) base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f -- 2.51.0

