Thread (42 messages) 42 messages, 5 authors, 2018-01-16

[PATCH 10/22] swiotlb: refactor coherent buffer allocation

From: robin.murphy@arm.com (Robin Murphy)
Date: 2018-01-10 17:02:36
Also in: linux-arch, linux-iommu, linux-mips, linuxppc-dev, lkml

On 10/01/18 15:46, Christoph Hellwig wrote:
On Wed, Jan 10, 2018 at 12:22:18PM +0000, Robin Murphy wrote:
quoted
quoted
+	if (phys_addr == SWIOTLB_MAP_ERROR)
+		goto out_warn;
   -		/* Confirm address can be DMA'd by device */
-		if (dev_addr + size - 1 > dma_mask) {
-			printk("hwdev DMA mask = 0x%016Lx, dev_addr = 0x%016Lx\n",
-			       (unsigned long long)dma_mask,
-			       (unsigned long long)dev_addr);
+	*dma_handle = swiotlb_phys_to_dma(dev, phys_addr);
nit: this should probably go after the dma_coherent_ok() check (as with the
original logic).
But the originall logic also needs the dma_addr_t for the
dma_coherent_ok check:

		dev_addr = swiotlb_phys_to_dma(hwdev, paddr);
		/* Confirm address can be DMA'd by device */
		if (dev_addr + size - 1 > dma_mask) {
			...
			goto err_warn;
		}

or do you mean assining to *dma_handle?  The dma_handle is not
valid for a failure return, so I don't think this should matter.
Yeah, only the assignment - as I said, it's just a stylistic nit; no big 
deal either way.
quoted
quoted
+	if (ret) {
+		*dma_handle = swiotlb_virt_to_bus(hwdev, ret);
+		if (dma_coherent_ok(hwdev, *dma_handle, size)) {
+			memset(ret, 0, size);
+			return ret;
+		}
Aren't we leaking the pages here?
Yes, that free_pages got lost somewhere in the rebases, I've added
it back.
Cool.

Robin.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help