[PATCH RFC v2 49/50] samples/kvm: Implement lookup_pfn_range provider operation

From: Ackerley Tng via B4 Relay

Date: Thu Oct 22 2026 - 19:51:34 EST


From: Ackerley Tng <ackerleytng@xxxxxxxxxx>

Implement .lookup_pfn_range to allow looking up index -> pfn mappings to
satisfy guest_memfd requirements and make this sample memory provider a
valid PFN mode provider.

This sample memory provider performs allocations upfront, so
.lookup_pfn_range doesn't do any allocations anyway and is only slightly
different from .get_pfn.

Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
---
samples/kvm/mem_provider_sample.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)

diff --git a/samples/kvm/mem_provider_sample.c b/samples/kvm/mem_provider_sample.c
index 3fa0d1a4335b5..5496e0c7864b9 100644
--- a/samples/kvm/mem_provider_sample.c
+++ b/samples/kvm/mem_provider_sample.c
@@ -197,10 +197,28 @@ static int mps_gmem_get_pfn(void *provider, pgoff_t index, unsigned long *pfn,
return 0;
}

+static int mps_gmem_lookup_pfn_range(void *provider, pgoff_t index,
+ unsigned long *pfn, size_t *nr_pages)
+{
+ struct file *resource_file = provider;
+ struct mps_info *info = resource_file->private_data;
+
+ if (index >= info->npages)
+ return -EINVAL;
+
+ if (test_bit(index, info->absent))
+ return -ENOENT;
+
+ *pfn = info->base_pfn + index;
+ *nr_pages = 1;
+ return 0;
+}
+
static const struct guest_memfd_provider_operations mps_gmem_provider_ops = {
.attach = mps_gmem_attach,
.release = mps_gmem_release,
.get_pfn = mps_gmem_get_pfn,
+ .lookup_pfn_range = mps_gmem_lookup_pfn_range,
.put_pfn_range = mps_gmem_put_pfn_range,
};


--
2.56.0.257.gf7497c7d27-goog