RE: [PATCH] fix cciss DMA unmap brokenness

From: Miller, Mike (OS Dev)
Date: Wed Aug 17 2005 - 15:56:46 EST


Alex wrote:
>
> 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>

Acked-by: Mike Miller <mike.miller@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/