projects/linux·commit bb2a37bf

[PATCH] cciss: fix for DMA brokeness

bb2a37bf · Mike Miller <[email protected]> · 2005-09-13 01:25:24 -07:00

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.

Signed-off-by: Alex Williamson <[email protected]>
Signed-off-by: Mike Miller <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Commit
bb2a37bf4131d64b76dcdb126e3ff5bf371b1842
Parents
6a445d3b

Changes

1 files changed · +6 −2

FileStatusAddDelContent
drivers/block/cciss.cmodified+6−2View file

drivers/block/cciss.c

View file
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 49f0541..c56f995 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -1730,8 +1730,10 @@ case CMD_HARDWARE_ERR:
}
}
/* 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);
@@ -2011,8 +2013,10 @@ resend_cmd1:
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);
}