Instead of always calling xen_destroy_contiguous_region() in case the memory is DMA-able for the used device, do so only in case it has been made DMA-able via xen_create_contiguous_region() before.
This will avoid a lot of xen_destroy_contiguous_region() calls for 64-bit capable devices. As the memory in question is owned by swiotlb-xen the PG_owner_priv_1 flag of the first allocated page can be used for remembering. Signed-off-by: Juergen Gross <jgr...@suse.com> --- drivers/xen/swiotlb-xen.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 43b6e65ae256..a72f181d8e20 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c @@ -321,6 +321,7 @@ xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size, xen_free_coherent_pages(hwdev, size, ret, (dma_addr_t)phys, attrs); return NULL; } + SetPageOwnerPriv1(virt_to_page(ret)); } memset(ret, 0, size); return ret; @@ -344,9 +345,11 @@ xen_swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, /* Convert the size to actually allocated. */ size = 1UL << (order + XEN_PAGE_SHIFT); - if ((dev_addr + size - 1 <= dma_mask) && - !WARN_ON(range_straddles_page_boundary(phys, size))) - xen_destroy_contiguous_region(phys, order); + if (PageOwnerPriv1(virt_to_page(vaddr))) { + if (!WARN_ON(range_straddles_page_boundary(phys, size))) + xen_destroy_contiguous_region(phys, order); + ClearPageOwnerPriv1(virt_to_page(vaddr)); + } xen_free_coherent_pages(hwdev, size, vaddr, (dma_addr_t)phys, attrs); } -- 2.16.4 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu