[PATCH RFC v3 47/88] samples/kvm: Implement put_pfn_range provider operation
From: Ackerley Tng via B4 Relay
Date: Fri Nov 06 2026 - 19:49:41 EST
From: Ackerley Tng <ackerleytng@xxxxxxxxxx>
When guest_memfd hole punches or destroys an instance backed by a PFN
provider, it invokes .put_pfn_range to release the physical memory back
to the provider.
Implement the .put_pfn_range callback in mps_gmem_provider_ops to clear
the CMA pages across the released range via clear_highpage(). This
ensures that subsequent accesses to punched ranges observe zeroed memory,
matching POSIX fallocate hole-punching semantics and preventing stale data
from being observed when pages are reused.
Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
---
samples/kvm/memory_provider.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/samples/kvm/memory_provider.c b/samples/kvm/memory_provider.c
index 1db69a8f58758..0a03623492f4c 100644
--- a/samples/kvm/memory_provider.c
+++ b/samples/kvm/memory_provider.c
@@ -17,6 +17,7 @@
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/gfp.h>
+#include <linux/highmem.h>
#include <linux/guest_memfd.h>
#include <linux/miscdevice.h>
#include <linux/mm.h>
@@ -198,6 +199,21 @@ static void mp_gmem_release(void *provider)
fput(resource_file);
}
+static void mp_gmem_put_pfn_range(void *provider, pgoff_t index,
+ size_t nr_pages)
+{
+ struct file *resource_file = provider;
+ struct mp_info *info = resource_file->private_data;
+ size_t i;
+
+ if (index >= info->npages)
+ return;
+
+ nr_pages = min_t(size_t, nr_pages, info->npages - index);
+ for (i = 0; i < nr_pages; i++)
+ clear_highpage(info->cma_pages + index + i);
+}
+
static int mp_gmem_get_pfn(void *provider, pgoff_t index, unsigned long *pfn,
int *max_order, u64 *pfn_attrs)
{
@@ -226,6 +242,7 @@ static const struct guest_memfd_provider_operations mp_gmem_provider_ops = {
.attach = mp_gmem_attach,
.release = mp_gmem_release,
.get_pfn = mp_gmem_get_pfn,
+ .put_pfn_range = mp_gmem_put_pfn_range,
};
static const struct file_operations mp_file_fops = {
--
2.56.0.455.g6c5a503b38-goog