| From: Joe Jin <joe.jin@oracle.com> |
| Date: Thu, 17 May 2018 12:33:28 -0700 |
| Subject: xen-swiotlb: fix the check condition for xen_swiotlb_free_coherent |
| |
| commit 4855c92dbb7b3b85c23e88ab7ca04f99b9677b41 upstream. |
| |
| When run raidconfig from Dom0 we found that the Xen DMA heap is reduced, |
| but Dom Heap is increased by the same size. Tracing raidconfig we found |
| that the related ioctl() in megaraid_sas will call dma_alloc_coherent() |
| to apply memory. If the memory allocated by Dom0 is not in the DMA area, |
| it will exchange memory with Xen to meet the requiment. Later drivers |
| call dma_free_coherent() to free the memory, on xen_swiotlb_free_coherent() |
| the check condition (dev_addr + size - 1 <= dma_mask) is always false, |
| it prevents calling xen_destroy_contiguous_region() to return the memory |
| to the Xen DMA heap. |
| |
| This issue introduced by commit 6810df88dcfc2 "xen-swiotlb: When doing |
| coherent alloc/dealloc check before swizzling the MFNs.". |
| |
| Signed-off-by: Joe Jin <joe.jin@oracle.com> |
| Tested-by: John Sobecki <john.sobecki@oracle.com> |
| Reviewed-by: Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/xen/swiotlb-xen.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/xen/swiotlb-xen.c |
| +++ b/drivers/xen/swiotlb-xen.c |
| @@ -366,7 +366,7 @@ xen_swiotlb_free_coherent(struct device |
| * physical address */ |
| phys = xen_bus_to_phys(dev_addr); |
| |
| - if (((dev_addr + size - 1 > dma_mask)) || |
| + if (((dev_addr + size - 1 <= dma_mask)) || |
| range_straddles_page_boundary(phys, size)) |
| xen_destroy_contiguous_region(phys, order); |
| |