Re: [PATCH v12 13/45] KVM: guest_memfd: Pass mapping type filter to invalidation helper
From: Fuad Tabba
Date: Tue Sep 01 2026 - 06:45:14 EST
On Mon, 31 Aug 2026 at 01:25, Ackerley Tng via B4 Relay
<devnull+ackerleytng.google.com@xxxxxxxxxx> wrote:
>
> From: Ackerley Tng <ackerleytng@xxxxxxxxxx>
>
> 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>
Reviewed-by: Fuad Tabba <fuad.tabba@xxxxxxxxx>
Cheers,
/fuad
> ---
> 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 e41802944756b..e19de803149c2 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.897.gb25b4bd76c-goog
>
>