summaryrefslogtreecommitdiffstats
path: root/sys/dev/trm
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2014-06-10 20:25:45 +0000
committerjhb <jhb@FreeBSD.org>2014-06-10 20:25:45 +0000
commit02e632b71287ac53801c62c26a1c00926fca8e2d (patch)
treefce070802b2d12919f979d51576d5aad6077a6c2 /sys/dev/trm
parente250a91c1da4cfd9eb0dab8e0aac2bc6fc7a8176 (diff)
downloadFreeBSD-src-02e632b71287ac53801c62c26a1c00926fca8e2d.zip
FreeBSD-src-02e632b71287ac53801c62c26a1c00926fca8e2d.tar.gz
Don't destroy bus_dma maps created by bus_dmamem_alloc(). In some cases,
don't create a map before calling bus_dmamem_alloc() (such maps were leaked). It is believed that the extra destroy of the map was generally harmless since bus_dmamem_alloc() often uses special maps for which bus_dmamap_destroy() is a no-op (e.g. on x86). Reviewed by: scottl
Diffstat (limited to 'sys/dev/trm')
-rw-r--r--sys/dev/trm/trm.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/sys/dev/trm/trm.c b/sys/dev/trm/trm.c
index 6032798..a5296f8 100644
--- a/sys/dev/trm/trm.c
+++ b/sys/dev/trm/trm.c
@@ -2944,12 +2944,11 @@ trm_destroySRB(PACB pACB)
pSRB = pACB->pFreeSRB;
while (pSRB) {
- if (pSRB->sg_dmamap) {
+ if (pSRB->SRBSGPhyAddr)
bus_dmamap_unload(pACB->sg_dmat, pSRB->sg_dmamap);
+ if (pSRB->pSRBSGL)
bus_dmamem_free(pACB->sg_dmat, pSRB->pSRBSGL,
pSRB->sg_dmamap);
- bus_dmamap_destroy(pACB->sg_dmat, pSRB->sg_dmamap);
- }
if (pSRB->dmamap)
bus_dmamap_destroy(pACB->buffer_dmat, pSRB->dmamap);
pSRB = pSRB->pNextSRB;
@@ -3494,7 +3493,6 @@ bad:
bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap);
bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers,
pACB->sense_dmamap);
- bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap);
}
if (pACB->sense_dmat)
bus_dma_tag_destroy(pACB->sense_dmat);
@@ -3502,11 +3500,10 @@ bad:
trm_destroySRB(pACB);
bus_dma_tag_destroy(pACB->sg_dmat);
}
- if (pACB->srb_dmamap) {
+ if (pACB->pFreeSRB) {
bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap);
bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB,
pACB->srb_dmamap);
- bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap);
}
if (pACB->srb_dmat)
bus_dma_tag_destroy(pACB->srb_dmat);
@@ -3618,19 +3615,17 @@ bad:
bus_dma_tag_destroy(pACB->sg_dmat);
}
- if (pACB->srb_dmamap) {
+ if (pACB->pFreeSRB) {
bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap);
bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB,
pACB->srb_dmamap);
- bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap);
}
if (pACB->srb_dmat)
bus_dma_tag_destroy(pACB->srb_dmat);
- if (pACB->sense_dmamap) {
+ if (pACB->sense_buffers) {
bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap);
bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers,
pACB->sense_dmamap);
- bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap);
}
if (pACB->sense_dmat)
bus_dma_tag_destroy(pACB->sense_dmat);
@@ -3680,12 +3675,10 @@ trm_detach(device_t dev)
bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap);
bus_dmamem_free(pACB->srb_dmat, pACB->pFreeSRB,
pACB->srb_dmamap);
- bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap);
bus_dma_tag_destroy(pACB->srb_dmat);
bus_dmamap_unload(pACB->sense_dmat, pACB->sense_dmamap);
bus_dmamem_free(pACB->sense_dmat, pACB->sense_buffers,
pACB->sense_dmamap);
- bus_dmamap_destroy(pACB->sense_dmat, pACB->sense_dmamap);
bus_dma_tag_destroy(pACB->sense_dmat);
bus_dma_tag_destroy(pACB->buffer_dmat);
bus_teardown_intr(dev, pACB->irq, pACB->ih);
OpenPOWER on IntegriCloud