[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] 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 <oleksandr_tyshchenko@xxxxxxxx> > > 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 <oleksandr_tyshchenko@xxxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > Cc: Juergen Gross <jgross@xxxxxxxx> > Cc: Xenia Ragiadakou <burzalodowa@xxxxxxxxx> > > Changes V1 -> V2: > - s/gfn_offset/pfn_offset > - clarify gfn calculation when granting a page > > Previous discussion is at: > https://lore.kernel.org/lkml/20221007132736.2275574-1-olekstysh@xxxxxxxxx/ > --- > 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 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |