[PATCH RFC v3 49/88] samples/kvm: Implement lookup_pfn_range provider operation
From: Ackerley Tng via B4 Relay
Date: Fri Nov 06 2026 - 19:54:48 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/memory_provider.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/samples/kvm/memory_provider.c b/samples/kvm/memory_provider.c
index 926f3cf68ed49..7fb7365b65940 100644
--- a/samples/kvm/memory_provider.c
+++ b/samples/kvm/memory_provider.c
@@ -249,10 +249,34 @@ static int mp_gmem_get_pfn(void *provider, pgoff_t index, unsigned long *pfn,
return 0;
}
+static int mp_gmem_lookup_pfn_range(void *provider, pgoff_t index,
+ unsigned long *pfn, size_t *nr_pages)
+{
+ struct file *resource_file = provider;
+ struct mp_info *info = resource_file->private_data;
+
+ if (index >= info->npages)
+ return -EINVAL;
+
+ if (test_bit(index, info->absent)) {
+ unsigned long next_present;
+
+ next_present = find_next_zero_bit(info->absent, info->npages,
+ index + 1);
+ *nr_pages = next_present - index;
+ return -ENOENT;
+ }
+
+ *pfn = info->base_pfn + index;
+ *nr_pages = find_next_bit(info->absent, info->npages, index + 1) - index;
+ return 0;
+}
+
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,
+ .lookup_pfn_range = mp_gmem_lookup_pfn_range,
.put_pfn_range = mp_gmem_put_pfn_range,
};
--
2.56.0.455.g6c5a503b38-goog