| From: |
| Mike Rapoport <rppt-AT-kernel.org> |
| To: |
| linux-mm-AT-kvack.org |
| Subject: |
| [PATCH RFC 00/17] mm, kvm: allow uffd suppot in guest_memfd |
| Date: |
| Tue, 27 Jan 2026 21:29:19 +0200 |
| Message-ID: |
| <20260127192936.1250096-1-rppt@kernel.org> |
| Cc: |
| Andrea Arcangeli <aarcange-AT-redhat.com>, Andrew Morton <akpm-AT-linux-foundation.org>, Axel Rasmussen <axelrasmussen-AT-google.com>, Baolin Wang <baolin.wang-AT-linux.alibaba.com>, David Hildenbrand <david-AT-redhat.com>, Hugh Dickins <hughd-AT-google.com>, James Houghton <jthoughton-AT-google.com>, "Liam R. Howlett" <Liam.Howlett-AT-oracle.com>, Lorenzo Stoakes <lorenzo.stoakes-AT-oracle.com>, Michal Hocko <mhocko-AT-suse.com>, Mike Rapoport <rppt-AT-kernel.org>, Muchun Song <muchun.song-AT-linux.dev>, Nikita Kalyazin <kalyazin-AT-amazon.com>, Oscar Salvador <osalvador-AT-suse.de>, Paolo Bonzini <pbonzini-AT-redhat.com>, Peter Xu <peterx-AT-redhat.com>, Sean Christopherson <seanjc-AT-google.com>, Shuah Khan <shuah-AT-kernel.org>, Suren Baghdasaryan <surenb-AT-google.com>, Vlastimil Babka <vbabka-AT-suse.cz>, linux-kernel-AT-vger.kernel.org, kvm-AT-vger.kernel.org, linux-kselftest-AT-vger.kernel.org |
| Archive-link: |
| Article |
From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
Hi,
These patches enable support for userfaultfd in guest_memfd.
They are quite different from the latest posting [1] so I'm restarting the
versioning. As there was a lot of tension around the topic, this is an RFC
to get some feedback and see how we can move forward.
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.
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.
[1] https://lore.kernel.org/all/20251130111812.699259-1-rppt@...
Mike Rapoport (Microsoft) (12):
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
userfaultfd, shmem: 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
mm: introduce VM_FAULT_UFFD_MINOR fault reason
Nikita Kalyazin (5):
mm: introduce VM_FAULT_UFFD_MISSING fault reason
KVM: guest_memfd: implement userfaultfd minor mode
KVM: guest_memfd: implement userfaultfd missing mode
KVM: selftests: test userfaultfd minor for guest_memfd
KVM: selftests: test userfaultfd missing for guest_memfd
include/linux/mm.h | 5 +
include/linux/mm_types.h | 15 +-
include/linux/shmem_fs.h | 14 -
include/linux/userfaultfd_k.h | 74 +-
mm/hugetlb.c | 21 +
mm/memory.c | 8 +-
mm/shmem.c | 188 +++--
mm/userfaultfd.c | 671 ++++++++++--------
.../testing/selftests/kvm/guest_memfd_test.c | 191 +++++
virt/kvm/guest_memfd.c | 134 +++-
10 files changed, 871 insertions(+), 450 deletions(-)
base-commit: f8f9c1f4d0c7a64600e2ca312dec824a0bc2f1da
--
2.51.0