summary refs log tree commit diff
path: root/kernel/dma/swiotlb.c
diff options
context:
space:
mode:
authorRobin Murphy <robin.murphy@arm.com>2018-11-21 16:00:51 +0000
committerChristoph Hellwig <hch@lst.de>2018-11-21 18:47:58 +0100
commitcb216b84d6ea24fa10f1e7aac35de77246841041 (patch)
tree4c1d102f7214ba97b3a43a1af8ba9495e23f3d76 /kernel/dma/swiotlb.c
parentb34087157dd76e8d96e5e52808134a791ac61e57 (diff)
downloadlinux-cb216b84d6ea24fa10f1e7aac35de77246841041.tar.gz
swiotlb: Skip cache maintenance on map error
If swiotlb_bounce_page() failed, calling arch_sync_dma_for_device() may
lead to such delights as performing cache maintenance on whatever
address phys_to_virt(SWIOTLB_MAP_ERROR) looks like, which is typically
outside the kernel memory map and goes about as well as expected.

Don't do that.

Fixes: a4a4330db46a ("swiotlb: add support for non-coherent DMA")
Tested-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'kernel/dma/swiotlb.c')
-rw-r--r--kernel/dma/swiotlb.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 5731daa09a32..045930e32c0e 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -679,7 +679,8 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page,
 	}
 
 	if (!dev_is_dma_coherent(dev) &&
-	    (attrs & DMA_ATTR_SKIP_CPU_SYNC) == 0)
+	    (attrs & DMA_ATTR_SKIP_CPU_SYNC) == 0 &&
+	    dev_addr != DIRECT_MAPPING_ERROR)
 		arch_sync_dma_for_device(dev, phys, size, dir);
 
 	return dev_addr;