[PATCH] fix cciss DMA unmap brokenness

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



   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 <[email protected]>

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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux