[PATCH v2 1/2] xen: don't allow gnttab_dma_[alloc|free]_pages() in PV guest
From: Juergen Gross
Date: Tue Nov 10 2026 - 05:36:46 EST
Today gnttab_dma_alloc_pages() or gnttab_dma_free_pages are never
called when running as a PV guest, but this holds for in-tree callers
only.
Bail out early when being called in PV mode in order to ensure no out
of tree module or future use cases are violating this assumption.
This enables to safely remove PV-only code from both functions.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
drivers/xen/grant-table.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index 604c4eea5930..56a497987942 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -1063,6 +1063,9 @@ int gnttab_dma_alloc_pages(struct gnttab_dma_alloc_args *args)
size_t size;
int i, ret;
+ if (WARN_ON(xen_pv_domain()))
+ return -EINVAL;
+
if (args->nr_pages < 0 || args->nr_pages > (INT_MAX >> PAGE_SHIFT))
return -ENOMEM;
@@ -1090,8 +1093,6 @@ int gnttab_dma_alloc_pages(struct gnttab_dma_alloc_args *args)
xenmem_reservation_scrub_page(page);
}
- xenmem_reservation_va_mapping_reset(args->nr_pages, args->pages);
-
ret = xenmem_reservation_decrease(args->nr_pages, args->frames);
if (ret != args->nr_pages) {
pr_debug("Failed to decrease reservation for DMA buffer\n");
@@ -1120,6 +1121,9 @@ int gnttab_dma_free_pages(struct gnttab_dma_alloc_args *args)
size_t size;
int i, ret;
+ if (WARN_ON(xen_pv_domain()))
+ return -EINVAL;
+
gnttab_pages_clear_private(args->nr_pages, args->pages);
for (i = 0; i < args->nr_pages; i++)
@@ -1133,9 +1137,6 @@ int gnttab_dma_free_pages(struct gnttab_dma_alloc_args *args)
ret = 0;
}
- xenmem_reservation_va_mapping_update(args->nr_pages, args->pages,
- args->frames);
-
size = args->nr_pages << PAGE_SHIFT;
if (args->coherent)
dma_free_coherent(args->dev, size,
--
2.56.0