[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] swiotlb-xen: update dev_addr after swapping pages
On 01/19/2017 01:39 PM, Stefano Stabellini wrote: > In xen_swiotlb_map_page and xen_swiotlb_map_sg_attrs, if the original > page is not suitable, we swap it for another page from the swiotlb > pool. > > In these cases, we don't update the previously calculated dma address > for the page before calling xen_dma_map_page. Thus, we end up calling > xen_dma_map_page passing the wrong dev_addr, resulting in > xen_dma_map_page mistakenly assuming that the page is foreign when it is > local. > > Fix the bug by updating dev_addr appropriately. > > This change has no effect on x86, because xen_dma_map_page is a stub > there. > > Signed-off-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > Signed-off-by: Pooya Keshavarzi <Pooya.Keshavarzi@xxxxxxxxxxxx> > Tested-by: Pooya Keshavarzi <Pooya.Keshavarzi@xxxxxxxxxxxx> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> > > diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c > index f905d6e..f8afc6d 100644 > --- a/drivers/xen/swiotlb-xen.c > +++ b/drivers/xen/swiotlb-xen.c > @@ -414,9 +414,9 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, > struct page *page, > if (map == SWIOTLB_MAP_ERROR) > return DMA_ERROR_CODE; > > + dev_addr = xen_phys_to_bus(map); > xen_dma_map_page(dev, pfn_to_page(map >> PAGE_SHIFT), > dev_addr, map & ~PAGE_MASK, size, dir, > attrs); > - dev_addr = xen_phys_to_bus(map); > > /* > * Ensure that the address returned is DMA'ble > @@ -575,13 +575,14 @@ void xen_swiotlb_unmap_page(struct device *hwdev, > dma_addr_t dev_addr, Interesting that git diff picked xen_swiotlb_unmap_page() here instead of xen_swiotlb_map_sg_attrs() -boris > sg_dma_len(sgl) = 0; > return 0; > } > + dev_addr = xen_phys_to_bus(map); > xen_dma_map_page(hwdev, pfn_to_page(map >> PAGE_SHIFT), > dev_addr, > map & ~PAGE_MASK, > sg->length, > dir, > attrs); > - sg->dma_address = xen_phys_to_bus(map); > + sg->dma_address = dev_addr; > } else { > /* we are not interested in the dma_addr returned by > * xen_dma_map_page, only in the potential cache > flushes executed _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |