2022-10-08 15:43:15

by Oleksandr Tyshchenko

[permalink] [raw]
Subject: [PATCH V2 0/2] Other misc fixes for Xen grant DMA-mapping layer

From: Oleksandr Tyshchenko <[email protected]>

Hello all.

These are other several fixes, which were identified and sent separately,
but now they are put together in completeness here.

Current series depends on the series which has been already pushed
to xen/tip.git for-linus-6.1:
https://lore.kernel.org/xen-devel/[email protected]/

Oleksandr Tyshchenko (2):
xen/virtio: Handle cases when page offset > PAGE_SIZE properly
xen/virtio: Convert PAGE_SIZE/PAGE_SHIFT/PFN_UP to Xen counterparts

drivers/xen/grant-dma-ops.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)

--
2.25.1


2022-10-08 15:49:36

by Oleksandr Tyshchenko

[permalink] [raw]
Subject: [PATCH V2 1/2] xen/virtio: Handle cases when page offset > PAGE_SIZE properly

From: Oleksandr Tyshchenko <[email protected]>

Passed to xen_grant_dma_map_page() offset in the page
can be > PAGE_SIZE even if the guest uses the same page granularity
as Xen (4KB).

Before current patch, if such case happened we ended up providing
grants for the whole region in xen_grant_dma_map_page() which
was really unnecessary. The more, we ended up not releasing all
grants which represented that region in xen_grant_dma_unmap_page().

Current patch updates the code to be able to deal with such cases.

Signed-off-by: Oleksandr Tyshchenko <[email protected]>
---
Cc: Juergen Gross <[email protected]>
Cc: Xenia Ragiadakou <[email protected]>

Changes V1 -> V2:
- s/gfn_offset/pfn_offset
- clarify gfn calculation when granting a page

Previous discussion is at:
https://lore.kernel.org/lkml/[email protected]/
---
drivers/xen/grant-dma-ops.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c
index c66f56d24013..1d018e3a68a0 100644
--- a/drivers/xen/grant-dma-ops.c
+++ b/drivers/xen/grant-dma-ops.c
@@ -168,7 +168,9 @@ 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(offset + size);
+ unsigned long dma_offset = offset_in_page(offset),
+ pfn_offset = PFN_DOWN(offset);
+ unsigned int i, n_pages = PFN_UP(dma_offset + size);
grant_ref_t grant;
dma_addr_t dma_handle;

@@ -187,10 +189,11 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,

for (i = 0; i < n_pages; i++) {
gnttab_grant_foreign_access_ref(grant + i, data->backend_domid,
- xen_page_to_gfn(page) + i, dir == DMA_TO_DEVICE);
+ pfn_to_gfn(page_to_xen_pfn(page) + i + pfn_offset),
+ dir == DMA_TO_DEVICE);
}

- dma_handle = grant_to_dma(grant) + offset;
+ dma_handle = grant_to_dma(grant) + dma_offset;

return dma_handle;
}
--
2.25.1

2022-10-08 15:53:17

by Oleksandr Tyshchenko

[permalink] [raw]
Subject: [PATCH V2 2/2] xen/virtio: Convert PAGE_SIZE/PAGE_SHIFT/PFN_UP to Xen counterparts

From: Oleksandr Tyshchenko <[email protected]>

Currently, a grant ref is always based on the Xen page granularity
(4KB), and guest commonly uses the same page granularity.
But the guest may use a different page granularity (i.e 64KB).
So adopt the code to be able to deal with it.

Signed-off-by: Oleksandr Tyshchenko <[email protected]>
---
Cc: Juergen Gross <[email protected]>
Cc: Xenia Ragiadakou <[email protected]>

Changes V1 -> V2:
- update commit description
- rebase
- use xen_offset_in_page() in xen_grant_dma_map(unmap)_page()

Previous discussion is at:
https://lore.kernel.org/xen-devel/[email protected]/
---
drivers/xen/grant-dma-ops.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c
index 1d018e3a68a0..aff0f95ed954 100644
--- a/drivers/xen/grant-dma-ops.c
+++ b/drivers/xen/grant-dma-ops.c
@@ -31,12 +31,12 @@ static DEFINE_XARRAY_FLAGS(xen_grant_dma_devices, XA_FLAGS_LOCK_IRQ);

static inline dma_addr_t grant_to_dma(grant_ref_t grant)
{
- return XEN_GRANT_DMA_ADDR_OFF | ((dma_addr_t)grant << PAGE_SHIFT);
+ return XEN_GRANT_DMA_ADDR_OFF | ((dma_addr_t)grant << XEN_PAGE_SHIFT);
}

static inline grant_ref_t dma_to_grant(dma_addr_t dma)
{
- return (grant_ref_t)((dma & ~XEN_GRANT_DMA_ADDR_OFF) >> PAGE_SHIFT);
+ return (grant_ref_t)((dma & ~XEN_GRANT_DMA_ADDR_OFF) >> XEN_PAGE_SHIFT);
}

static struct xen_grant_dma_data *find_xen_grant_dma_data(struct device *dev)
@@ -79,7 +79,7 @@ static void *xen_grant_dma_alloc(struct device *dev, size_t size,
unsigned long attrs)
{
struct xen_grant_dma_data *data;
- unsigned int i, n_pages = PFN_UP(size);
+ unsigned int i, n_pages = XEN_PFN_UP(size);
unsigned long pfn;
grant_ref_t grant;
void *ret;
@@ -91,14 +91,14 @@ static void *xen_grant_dma_alloc(struct device *dev, size_t size,
if (unlikely(data->broken))
return NULL;

- ret = alloc_pages_exact(n_pages * PAGE_SIZE, gfp);
+ ret = alloc_pages_exact(n_pages * XEN_PAGE_SIZE, gfp);
if (!ret)
return NULL;

pfn = virt_to_pfn(ret);

if (gnttab_alloc_grant_reference_seq(n_pages, &grant)) {
- free_pages_exact(ret, n_pages * PAGE_SIZE);
+ free_pages_exact(ret, n_pages * XEN_PAGE_SIZE);
return NULL;
}

@@ -116,7 +116,7 @@ static void xen_grant_dma_free(struct device *dev, size_t size, void *vaddr,
dma_addr_t dma_handle, unsigned long attrs)
{
struct xen_grant_dma_data *data;
- unsigned int i, n_pages = PFN_UP(size);
+ unsigned int i, n_pages = XEN_PFN_UP(size);
grant_ref_t grant;

data = find_xen_grant_dma_data(dev);
@@ -138,7 +138,7 @@ static void xen_grant_dma_free(struct device *dev, size_t size, void *vaddr,

gnttab_free_grant_reference_seq(grant, n_pages);

- free_pages_exact(vaddr, n_pages * PAGE_SIZE);
+ free_pages_exact(vaddr, n_pages * XEN_PAGE_SIZE);
}

static struct page *xen_grant_dma_alloc_pages(struct device *dev, size_t size,
@@ -168,9 +168,9 @@ 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 long dma_offset = offset_in_page(offset),
- pfn_offset = PFN_DOWN(offset);
- unsigned int i, n_pages = PFN_UP(dma_offset + size);
+ unsigned long dma_offset = xen_offset_in_page(offset),
+ pfn_offset = XEN_PFN_DOWN(offset);
+ unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size);
grant_ref_t grant;
dma_addr_t dma_handle;

@@ -203,8 +203,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 long offset = dma_handle & (PAGE_SIZE - 1);
- unsigned int i, n_pages = PFN_UP(offset + size);
+ unsigned long dma_offset = xen_offset_in_page(dma_handle);
+ unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size);
grant_ref_t grant;

if (WARN_ON(dir == DMA_NONE))
--
2.25.1

2022-10-14 00:42:18

by Stefano Stabellini

[permalink] [raw]
Subject: Re: [PATCH V2 1/2] xen/virtio: Handle cases when page offset > PAGE_SIZE properly

On Sat, 8 Oct 2022, Oleksandr Tyshchenko wrote:
> From: Oleksandr Tyshchenko <[email protected]>
>
> Passed to xen_grant_dma_map_page() offset in the page
> can be > PAGE_SIZE even if the guest uses the same page granularity
> as Xen (4KB).
>
> Before current patch, if such case happened we ended up providing
> grants for the whole region in xen_grant_dma_map_page() which
> was really unnecessary. The more, we ended up not releasing all
> grants which represented that region in xen_grant_dma_unmap_page().
>
> Current patch updates the code to be able to deal with such cases.
>
> Signed-off-by: Oleksandr Tyshchenko <[email protected]>

Reviewed-by: Stefano Stabellini <[email protected]>


> ---
> Cc: Juergen Gross <[email protected]>
> Cc: Xenia Ragiadakou <[email protected]>
>
> Changes V1 -> V2:
> - s/gfn_offset/pfn_offset
> - clarify gfn calculation when granting a page
>
> Previous discussion is at:
> https://lore.kernel.org/lkml/[email protected]/
> ---
> drivers/xen/grant-dma-ops.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c
> index c66f56d24013..1d018e3a68a0 100644
> --- a/drivers/xen/grant-dma-ops.c
> +++ b/drivers/xen/grant-dma-ops.c
> @@ -168,7 +168,9 @@ 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(offset + size);
> + unsigned long dma_offset = offset_in_page(offset),
> + pfn_offset = PFN_DOWN(offset);
> + unsigned int i, n_pages = PFN_UP(dma_offset + size);
> grant_ref_t grant;
> dma_addr_t dma_handle;
>
> @@ -187,10 +189,11 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,
>
> for (i = 0; i < n_pages; i++) {
> gnttab_grant_foreign_access_ref(grant + i, data->backend_domid,
> - xen_page_to_gfn(page) + i, dir == DMA_TO_DEVICE);
> + pfn_to_gfn(page_to_xen_pfn(page) + i + pfn_offset),
> + dir == DMA_TO_DEVICE);
> }
>
> - dma_handle = grant_to_dma(grant) + offset;
> + dma_handle = grant_to_dma(grant) + dma_offset;
>
> return dma_handle;
> }
> --
> 2.25.1
>

2022-10-14 01:40:53

by Stefano Stabellini

[permalink] [raw]
Subject: Re: [PATCH V2 2/2] xen/virtio: Convert PAGE_SIZE/PAGE_SHIFT/PFN_UP to Xen counterparts

On Sat, 8 Oct 2022, Oleksandr Tyshchenko wrote:
> From: Oleksandr Tyshchenko <[email protected]>
>
> Currently, a grant ref is always based on the Xen page granularity
> (4KB), and guest commonly uses the same page granularity.
> But the guest may use a different page granularity (i.e 64KB).
> So adopt the code to be able to deal with it.
>
> Signed-off-by: Oleksandr Tyshchenko <[email protected]>

Acked-by: Stefano Stabellini <[email protected]>


> ---
> Cc: Juergen Gross <[email protected]>
> Cc: Xenia Ragiadakou <[email protected]>
>
> Changes V1 -> V2:
> - update commit description
> - rebase
> - use xen_offset_in_page() in xen_grant_dma_map(unmap)_page()
>
> Previous discussion is at:
> https://lore.kernel.org/xen-devel/[email protected]/
> ---
> drivers/xen/grant-dma-ops.c | 24 ++++++++++++------------
> 1 file changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c
> index 1d018e3a68a0..aff0f95ed954 100644
> --- a/drivers/xen/grant-dma-ops.c
> +++ b/drivers/xen/grant-dma-ops.c
> @@ -31,12 +31,12 @@ static DEFINE_XARRAY_FLAGS(xen_grant_dma_devices, XA_FLAGS_LOCK_IRQ);
>
> static inline dma_addr_t grant_to_dma(grant_ref_t grant)
> {
> - return XEN_GRANT_DMA_ADDR_OFF | ((dma_addr_t)grant << PAGE_SHIFT);
> + return XEN_GRANT_DMA_ADDR_OFF | ((dma_addr_t)grant << XEN_PAGE_SHIFT);
> }
>
> static inline grant_ref_t dma_to_grant(dma_addr_t dma)
> {
> - return (grant_ref_t)((dma & ~XEN_GRANT_DMA_ADDR_OFF) >> PAGE_SHIFT);
> + return (grant_ref_t)((dma & ~XEN_GRANT_DMA_ADDR_OFF) >> XEN_PAGE_SHIFT);
> }
>
> static struct xen_grant_dma_data *find_xen_grant_dma_data(struct device *dev)
> @@ -79,7 +79,7 @@ static void *xen_grant_dma_alloc(struct device *dev, size_t size,
> unsigned long attrs)
> {
> struct xen_grant_dma_data *data;
> - unsigned int i, n_pages = PFN_UP(size);
> + unsigned int i, n_pages = XEN_PFN_UP(size);
> unsigned long pfn;
> grant_ref_t grant;
> void *ret;
> @@ -91,14 +91,14 @@ static void *xen_grant_dma_alloc(struct device *dev, size_t size,
> if (unlikely(data->broken))
> return NULL;
>
> - ret = alloc_pages_exact(n_pages * PAGE_SIZE, gfp);
> + ret = alloc_pages_exact(n_pages * XEN_PAGE_SIZE, gfp);
> if (!ret)
> return NULL;
>
> pfn = virt_to_pfn(ret);
>
> if (gnttab_alloc_grant_reference_seq(n_pages, &grant)) {
> - free_pages_exact(ret, n_pages * PAGE_SIZE);
> + free_pages_exact(ret, n_pages * XEN_PAGE_SIZE);
> return NULL;
> }
>
> @@ -116,7 +116,7 @@ static void xen_grant_dma_free(struct device *dev, size_t size, void *vaddr,
> dma_addr_t dma_handle, unsigned long attrs)
> {
> struct xen_grant_dma_data *data;
> - unsigned int i, n_pages = PFN_UP(size);
> + unsigned int i, n_pages = XEN_PFN_UP(size);
> grant_ref_t grant;
>
> data = find_xen_grant_dma_data(dev);
> @@ -138,7 +138,7 @@ static void xen_grant_dma_free(struct device *dev, size_t size, void *vaddr,
>
> gnttab_free_grant_reference_seq(grant, n_pages);
>
> - free_pages_exact(vaddr, n_pages * PAGE_SIZE);
> + free_pages_exact(vaddr, n_pages * XEN_PAGE_SIZE);
> }
>
> static struct page *xen_grant_dma_alloc_pages(struct device *dev, size_t size,
> @@ -168,9 +168,9 @@ 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 long dma_offset = offset_in_page(offset),
> - pfn_offset = PFN_DOWN(offset);
> - unsigned int i, n_pages = PFN_UP(dma_offset + size);
> + unsigned long dma_offset = xen_offset_in_page(offset),
> + pfn_offset = XEN_PFN_DOWN(offset);
> + unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size);
> grant_ref_t grant;
> dma_addr_t dma_handle;
>
> @@ -203,8 +203,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 long offset = dma_handle & (PAGE_SIZE - 1);
> - unsigned int i, n_pages = PFN_UP(offset + size);
> + unsigned long dma_offset = xen_offset_in_page(dma_handle);
> + unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size);
> grant_ref_t grant;
>
> if (WARN_ON(dir == DMA_NONE))
> --
> 2.25.1
>

2022-10-14 07:57:11

by Xenia Ragiadakou

[permalink] [raw]
Subject: Re: [PATCH V2 1/2] xen/virtio: Handle cases when page offset > PAGE_SIZE properly

On 10/8/22 18:10, Oleksandr Tyshchenko wrote:
> From: Oleksandr Tyshchenko <[email protected]>
>
> Passed to xen_grant_dma_map_page() offset in the page
> can be > PAGE_SIZE even if the guest uses the same page granularity
> as Xen (4KB).
>
> Before current patch, if such case happened we ended up providing
> grants for the whole region in xen_grant_dma_map_page() which
> was really unnecessary. The more, we ended up not releasing all
> grants which represented that region in xen_grant_dma_unmap_page().
>
> Current patch updates the code to be able to deal with such cases.
>
> Signed-off-by: Oleksandr Tyshchenko <[email protected]>

Reviewed-by: Xenia Ragiadakou <[email protected]>

> ---
> Cc: Juergen Gross <[email protected]>
> Cc: Xenia Ragiadakou <[email protected]>
>
> Changes V1 -> V2:
> - s/gfn_offset/pfn_offset
> - clarify gfn calculation when granting a page
>
> Previous discussion is at:
> https://lore.kernel.org/lkml/[email protected]/
> ---
> drivers/xen/grant-dma-ops.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c
> index c66f56d24013..1d018e3a68a0 100644
> --- a/drivers/xen/grant-dma-ops.c
> +++ b/drivers/xen/grant-dma-ops.c
> @@ -168,7 +168,9 @@ 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(offset + size);
> + unsigned long dma_offset = offset_in_page(offset),
> + pfn_offset = PFN_DOWN(offset);
> + unsigned int i, n_pages = PFN_UP(dma_offset + size);
> grant_ref_t grant;
> dma_addr_t dma_handle;
>
> @@ -187,10 +189,11 @@ static dma_addr_t xen_grant_dma_map_page(struct device *dev, struct page *page,
>
> for (i = 0; i < n_pages; i++) {
> gnttab_grant_foreign_access_ref(grant + i, data->backend_domid,
> - xen_page_to_gfn(page) + i, dir == DMA_TO_DEVICE);
> + pfn_to_gfn(page_to_xen_pfn(page) + i + pfn_offset),
> + dir == DMA_TO_DEVICE);
> }
>
> - dma_handle = grant_to_dma(grant) + offset;
> + dma_handle = grant_to_dma(grant) + dma_offset;
>
> return dma_handle;
> }

--
Xenia

2022-10-14 08:01:45

by Xenia Ragiadakou

[permalink] [raw]
Subject: Re: [PATCH V2 2/2] xen/virtio: Convert PAGE_SIZE/PAGE_SHIFT/PFN_UP to Xen counterparts

On 10/8/22 18:10, Oleksandr Tyshchenko wrote:
> From: Oleksandr Tyshchenko <[email protected]>
>
> Currently, a grant ref is always based on the Xen page granularity
> (4KB), and guest commonly uses the same page granularity.
> But the guest may use a different page granularity (i.e 64KB).
> So adopt the code to be able to deal with it.
>
> Signed-off-by: Oleksandr Tyshchenko <[email protected]>

Reviewed-by: Xenia Ragiadakou <[email protected]>

> ---
> Cc: Juergen Gross <[email protected]>
> Cc: Xenia Ragiadakou <[email protected]>
>
> Changes V1 -> V2:
> - update commit description
> - rebase
> - use xen_offset_in_page() in xen_grant_dma_map(unmap)_page()
>
> Previous discussion is at:
> https://lore.kernel.org/xen-devel/[email protected]/
> ---
> drivers/xen/grant-dma-ops.c | 24 ++++++++++++------------
> 1 file changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c
> index 1d018e3a68a0..aff0f95ed954 100644
> --- a/drivers/xen/grant-dma-ops.c
> +++ b/drivers/xen/grant-dma-ops.c
> @@ -31,12 +31,12 @@ static DEFINE_XARRAY_FLAGS(xen_grant_dma_devices, XA_FLAGS_LOCK_IRQ);
>
> static inline dma_addr_t grant_to_dma(grant_ref_t grant)
> {
> - return XEN_GRANT_DMA_ADDR_OFF | ((dma_addr_t)grant << PAGE_SHIFT);
> + return XEN_GRANT_DMA_ADDR_OFF | ((dma_addr_t)grant << XEN_PAGE_SHIFT);
> }
>
> static inline grant_ref_t dma_to_grant(dma_addr_t dma)
> {
> - return (grant_ref_t)((dma & ~XEN_GRANT_DMA_ADDR_OFF) >> PAGE_SHIFT);
> + return (grant_ref_t)((dma & ~XEN_GRANT_DMA_ADDR_OFF) >> XEN_PAGE_SHIFT);
> }
>
> static struct xen_grant_dma_data *find_xen_grant_dma_data(struct device *dev)
> @@ -79,7 +79,7 @@ static void *xen_grant_dma_alloc(struct device *dev, size_t size,
> unsigned long attrs)
> {
> struct xen_grant_dma_data *data;
> - unsigned int i, n_pages = PFN_UP(size);
> + unsigned int i, n_pages = XEN_PFN_UP(size);
> unsigned long pfn;
> grant_ref_t grant;
> void *ret;
> @@ -91,14 +91,14 @@ static void *xen_grant_dma_alloc(struct device *dev, size_t size,
> if (unlikely(data->broken))
> return NULL;
>
> - ret = alloc_pages_exact(n_pages * PAGE_SIZE, gfp);
> + ret = alloc_pages_exact(n_pages * XEN_PAGE_SIZE, gfp);
> if (!ret)
> return NULL;
>
> pfn = virt_to_pfn(ret);
>
> if (gnttab_alloc_grant_reference_seq(n_pages, &grant)) {
> - free_pages_exact(ret, n_pages * PAGE_SIZE);
> + free_pages_exact(ret, n_pages * XEN_PAGE_SIZE);
> return NULL;
> }
>
> @@ -116,7 +116,7 @@ static void xen_grant_dma_free(struct device *dev, size_t size, void *vaddr,
> dma_addr_t dma_handle, unsigned long attrs)
> {
> struct xen_grant_dma_data *data;
> - unsigned int i, n_pages = PFN_UP(size);
> + unsigned int i, n_pages = XEN_PFN_UP(size);
> grant_ref_t grant;
>
> data = find_xen_grant_dma_data(dev);
> @@ -138,7 +138,7 @@ static void xen_grant_dma_free(struct device *dev, size_t size, void *vaddr,
>
> gnttab_free_grant_reference_seq(grant, n_pages);
>
> - free_pages_exact(vaddr, n_pages * PAGE_SIZE);
> + free_pages_exact(vaddr, n_pages * XEN_PAGE_SIZE);
> }
>
> static struct page *xen_grant_dma_alloc_pages(struct device *dev, size_t size,
> @@ -168,9 +168,9 @@ 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 long dma_offset = offset_in_page(offset),
> - pfn_offset = PFN_DOWN(offset);
> - unsigned int i, n_pages = PFN_UP(dma_offset + size);
> + unsigned long dma_offset = xen_offset_in_page(offset),
> + pfn_offset = XEN_PFN_DOWN(offset);
> + unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size);
> grant_ref_t grant;
> dma_addr_t dma_handle;
>
> @@ -203,8 +203,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 long offset = dma_handle & (PAGE_SIZE - 1);
> - unsigned int i, n_pages = PFN_UP(offset + size);
> + unsigned long dma_offset = xen_offset_in_page(dma_handle);
> + unsigned int i, n_pages = XEN_PFN_UP(dma_offset + size);
> grant_ref_t grant;
>
> if (WARN_ON(dir == DMA_NONE))

--
Xenia

2022-10-15 14:07:46

by Juergen Gross

[permalink] [raw]
Subject: Re: [PATCH V2 0/2] Other misc fixes for Xen grant DMA-mapping layer

On 08.10.22 17:10, Oleksandr Tyshchenko wrote:
> From: Oleksandr Tyshchenko <[email protected]>
>
> Hello all.
>
> These are other several fixes, which were identified and sent separately,
> but now they are put together in completeness here.
>
> Current series depends on the series which has been already pushed
> to xen/tip.git for-linus-6.1:
> https://lore.kernel.org/xen-devel/[email protected]/
>
> Oleksandr Tyshchenko (2):
> xen/virtio: Handle cases when page offset > PAGE_SIZE properly
> xen/virtio: Convert PAGE_SIZE/PAGE_SHIFT/PFN_UP to Xen counterparts
>
> drivers/xen/grant-dma-ops.c | 27 +++++++++++++++------------
> 1 file changed, 15 insertions(+), 12 deletions(-)
>

Series pushed to xen/tip.git for-linus-6.1


Juergen


Attachments:
OpenPGP_0xB0DE9DD628BF132F.asc (3.08 kB)
OpenPGP public key
OpenPGP_signature (505.00 B)
OpenPGP digital signature
Download all attachments