[PATCH] fix cciss DMA unmap brokenness

From: Alex Williamson
Date: Wed Aug 17 2005 - 14:16:48 EST



The CCISS driver seems to loose track of DMA mappings created by it's
fill_cmd() routine. Neither callers of this routine are extracting the
DMA address created in order to do the unmap. Instead, they simply try
to unmap 0x0. It's easy to see this problem on an x86_64 system when
using the "swiotlb=force" boot option. In this case, the driver is
leaking resources of the swiotlb and not causing a sync of the bounce
buffer. Thanks

Signed-off-by: Alex Williamson <alex.williamson@xxxxxx>

diff -r b9c8e9fdd6b2 drivers/block/cciss.c
--- a/drivers/block/cciss.c Wed Aug 17 04:06:25 2005
+++ b/drivers/block/cciss.c Wed Aug 17 12:53:40 2005
@@ -1420,8 +1420,10 @@
}
}
/* unlock the buffers from DMA */
+ buff_dma_handle.val32.lower = c->SG[0].Addr.lower;
+ buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
pci_unmap_single( h->pdev, (dma_addr_t) buff_dma_handle.val,
- size, PCI_DMA_BIDIRECTIONAL);
+ c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
cmd_free(h, c, 0);
return(return_status);

@@ -1860,8 +1862,10 @@

cleanup1:
/* unlock the data buffer from DMA */
+ buff_dma_handle.val32.lower = c->SG[0].Addr.lower;
+ buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
pci_unmap_single(info_p->pdev, (dma_addr_t) buff_dma_handle.val,
- size, PCI_DMA_BIDIRECTIONAL);
+ c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
cmd_free(info_p, c, 1);
return (status);
}


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/