OSDN Git Service

xen/virtio: Fix n_pages calculation in xen_grant_dma_map(unmap)_page()
authorOleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Wed, 5 Oct 2022 17:48:22 +0000 (20:48 +0300)
committerJuergen Gross <jgross@suse.com>
Thu, 6 Oct 2022 06:30:10 +0000 (08:30 +0200)
Take page offset into the account when calculating the number of pages
to be granted.

Fixes: d6aca3504c7d ("xen/grant-dma-ops: Add option to restrict memory access under Xen")
Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Juergen Gross <jgross@suse.com>
Link: https://lore.kernel.org/r/20221005174823.1800761-2-olekstysh@gmail.com
Signed-off-by: Juergen Gross <jgross@suse.com>
drivers/xen/grant-dma-ops.c

index 8973fc1..1998d0e 100644 (file)
@@ -153,7 +153,7 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,
                                         unsigned long attrs)
 {
        struct xen_grant_dma_data *data;
-       unsigned int i, n_pages = PFN_UP(size);
+       unsigned int i, n_pages = PFN_UP(offset + size);
        grant_ref_t grant;
        dma_addr_t dma_handle;
 
@@ -185,7 +185,8 @@ static void xen_grant_dma_unmap_page(struct device *dev, dma_addr_t dma_handle,
                                     unsigned long attrs)
 {
        struct xen_grant_dma_data *data;
-       unsigned int i, n_pages = PFN_UP(size);
+       unsigned long offset = dma_handle & (PAGE_SIZE - 1);
+       unsigned int i, n_pages = PFN_UP(offset + size);
        grant_ref_t grant;
 
        if (WARN_ON(dir == DMA_NONE))