|
|
Log in / Subscribe / Register

mm, kvm: allow uffd support in guest_memfd

From:  Mike Rapoport <rppt-AT-kernel.org>
To:  Andrew Morton <akpm-AT-linux-foundation.org>
Subject:  [PATCH v3 00/15] mm, kvm: allow uffd support in guest_memfd
Date:  Mon, 30 Mar 2026 13:11:01 +0300
Message-ID:  <20260330101116.1117699-1-rppt@kernel.org>
Cc:  Andrea Arcangeli <aarcange-AT-redhat.com>, Andrei Vagin <avagin-AT-google.com>, Axel Rasmussen <axelrasmussen-AT-google.com>, Baolin Wang <baolin.wang-AT-linux.alibaba.com>, David Hildenbrand <david-AT-kernel.org>, Harry Yoo <harry.yoo-AT-oracle.com>, Hugh Dickins <hughd-AT-google.com>, James Houghton <jthoughton-AT-google.com>, "Liam R. Howlett" <Liam.Howlett-AT-oracle.com>, "Lorenzo Stoakes (Oracle)" <ljs-AT-kernel.org>, "Matthew Wilcox (Oracle)" <willy-AT-infradead.org>, 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>, kvm-AT-vger.kernel.org, linux-fsdevel-AT-vger.kernel.org, linux-kernel-AT-vger.kernel.org, linux-kselftest-AT-vger.kernel.org, linux-mm-AT-kvack.org
Archive-link:  Article

From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>

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.

v3 changes:
* add fixes from Harry and Andrei
* fix handling of WP-only mode for WP_ASYNC contexts in vma_can_userfault()
* address David's comments about mfill_get_pmd() and rename it to
  mfill_establish_pmd()
* add VM_WARN()s for unsupported operations (James)
* update comments using James' suggestions

v2: https://lore.kernel.org/all/20260306171815.3160826-1-rppt...
* 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/20260127192936.1250096-1-rppt...

Mike Rapoport (Microsoft) (11):
  userfaultfd: introduce mfill_copy_folio_locked() helper
  userfaultfd: introduce struct mfill_state
  userfaultfd: introduce mfill_establish_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                              | 694 ++++++++++--------
 .../testing/selftests/kvm/guest_memfd_test.c  | 191 +++++
 virt/kvm/guest_memfd.c                        |  84 ++-
 10 files changed, 860 insertions(+), 448 deletions(-)


base-commit: c369299895a591d96745d6492d4888259b004a9e
--
2.53.0



Copyright © 2026, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds