[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

 


Rackspace

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