[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 1/2] xen: don't allow gnttab_dma_[alloc|free]_pages() in PV guest


  • To: linux-kernel@xxxxxxxxxxxxxxx
  • From: Juergen Gross <jgross@xxxxxxxx>
  • Date: Tue, 10 Nov 2026 10:56:04 +0100
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=susede1 header.d=suse.com header.i="@suse.com" header.h="From:Date:Message-ID:To:Cc:MIME-Version:Content-Transfer-Encoding:In-Reply-To:References"; dkim=pass header.s=susede1 header.d=suse.com header.i="@suse.com" header.h="From:Date:Message-ID:To:Cc:MIME-Version:Content-Transfer-Encoding:In-Reply-To:References"
  • Authentication-results: smtp-out2.suse.de; none
  • Cc: Juergen Gross <jgross@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Tue, 10 Nov 2026 09:56:17 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.