[PATCH v11 12/46] KVM: guest_memfd: Pass mapping type filter to invalidation helper

From: Ackerley Tng

Date: Wed Aug 26 2026 - 05:41:24 EST


Accept the mapping type filter as a parameter in the invalidation start
helper instead of querying it internally. This allows callers to specify
which mappings (shared, private, or both) should be invalidated.

In the next patch, the conversion process will use this new parameter to
invalidate mappings only when they're different from the target state of
the conversion, i.e. invalidate only shared mappings on a shared to private
conversion and not both.

No functional change intended.

Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
---
virt/kvm/guest_memfd.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
index d4a9877b29ab0..ab29e7f555787 100644
--- a/virt/kvm/guest_memfd.c
+++ b/virt/kvm/guest_memfd.c
@@ -192,13 +192,13 @@ static void __kvm_gmem_invalidate_start(struct gmem_file *f, pgoff_t start,
}

static void kvm_gmem_invalidate_start(struct inode *inode, pgoff_t start,
- pgoff_t end)
+ pgoff_t end,
+ enum kvm_gfn_range_filter filter)
{
- enum kvm_gfn_range_filter attr_filter = kvm_gmem_get_all_gfns_filter(inode);
struct gmem_file *f;

kvm_gmem_for_each_file(f, inode)
- __kvm_gmem_invalidate_start(f, start, end, attr_filter);
+ __kvm_gmem_invalidate_start(f, start, end, filter);
}

static void __kvm_gmem_invalidate_end(struct gmem_file *f, pgoff_t start,
@@ -224,6 +224,7 @@ static void kvm_gmem_invalidate_end(struct inode *inode, pgoff_t start,

static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len)
{
+ enum kvm_gfn_range_filter filter = kvm_gmem_get_all_gfns_filter(inode);
pgoff_t start = offset >> PAGE_SHIFT;
pgoff_t end = (offset + len) >> PAGE_SHIFT;

@@ -233,7 +234,7 @@ static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len)
*/
filemap_invalidate_lock(inode->i_mapping);

- kvm_gmem_invalidate_start(inode, start, end);
+ kvm_gmem_invalidate_start(inode, start, end, filter);

truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1);

@@ -522,6 +523,8 @@ static int kvm_gmem_migrate_folio(struct address_space *mapping,

static int kvm_gmem_error_folio(struct address_space *mapping, struct folio *folio)
{
+ struct inode *inode = mapping->host;
+ enum kvm_gfn_range_filter filter;
pgoff_t start, end;

filemap_invalidate_lock_shared(mapping);
@@ -529,7 +532,8 @@ static int kvm_gmem_error_folio(struct address_space *mapping, struct folio *fol
start = folio->index;
end = start + folio_nr_pages(folio);

- kvm_gmem_invalidate_start(mapping->host, start, end);
+ filter = kvm_gmem_get_all_gfns_filter(inode);
+ kvm_gmem_invalidate_start(inode, start, end, filter);

/*
* Do not truncate the range, what action is taken in response to the

--
2.55.0.887.g758fc8c411-goog