diff options
author | John Baldwin <jhb@FreeBSD.org> | 2014-06-11 14:53:58 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2014-06-11 14:53:58 +0000 |
commit | 068d8643adb13434b57fdd5febf43a11194d508f (patch) | |
tree | 5544dcfb2be4391a29657081ad30163d6c502e86 /sys/dev/vr | |
parent | 4f655310bff3d8052e35426ad6188a81147a7ed9 (diff) | |
download | src-068d8643adb13434b57fdd5febf43a11194d508f.tar.gz src-068d8643adb13434b57fdd5febf43a11194d508f.zip |
Fix various NIC drivers to properly cleanup static DMA resources.
In particular, don't check the value of the bus_dma map against NULL
to determine if either bus_dmamem_alloc() or bus_dmamap_load() succeeded.
Instead, assume that bus_dmamap_load() succeeeded (and thus that
bus_dmamap_unload() should be called) if the bus address for a resource
is non-zero, and assume that bus_dmamem_alloc() succeeded (and thus
that bus_dmamem_free() should be called) if the virtual address for a
resource is not NULL.
In many cases these bugs could result in leaks when a driver was detached.
Reviewed by: yongari
MFC after: 2 weeks
Notes
Notes:
svn path=/head/; revision=267363
Diffstat (limited to 'sys/dev/vr')
-rw-r--r-- | sys/dev/vr/if_vr.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/sys/dev/vr/if_vr.c b/sys/dev/vr/if_vr.c index 0a1d7df2001f..cfc70aaec0e4 100644 --- a/sys/dev/vr/if_vr.c +++ b/sys/dev/vr/if_vr.c @@ -1060,31 +1060,29 @@ vr_dma_free(struct vr_softc *sc) /* Tx ring. */ if (sc->vr_cdata.vr_tx_ring_tag) { - if (sc->vr_cdata.vr_tx_ring_map) + if (sc->vr_rdata.vr_tx_ring_paddr) bus_dmamap_unload(sc->vr_cdata.vr_tx_ring_tag, sc->vr_cdata.vr_tx_ring_map); - if (sc->vr_cdata.vr_tx_ring_map && - sc->vr_rdata.vr_tx_ring) + if (sc->vr_rdata.vr_tx_ring) bus_dmamem_free(sc->vr_cdata.vr_tx_ring_tag, sc->vr_rdata.vr_tx_ring, sc->vr_cdata.vr_tx_ring_map); sc->vr_rdata.vr_tx_ring = NULL; - sc->vr_cdata.vr_tx_ring_map = NULL; + sc->vr_rdata.vr_tx_ring_paddr = 0; bus_dma_tag_destroy(sc->vr_cdata.vr_tx_ring_tag); sc->vr_cdata.vr_tx_ring_tag = NULL; } /* Rx ring. */ if (sc->vr_cdata.vr_rx_ring_tag) { - if (sc->vr_cdata.vr_rx_ring_map) + if (sc->vr_rdata.vr_rx_ring_paddr) bus_dmamap_unload(sc->vr_cdata.vr_rx_ring_tag, sc->vr_cdata.vr_rx_ring_map); - if (sc->vr_cdata.vr_rx_ring_map && - sc->vr_rdata.vr_rx_ring) + if (sc->vr_rdata.vr_rx_ring) bus_dmamem_free(sc->vr_cdata.vr_rx_ring_tag, sc->vr_rdata.vr_rx_ring, sc->vr_cdata.vr_rx_ring_map); sc->vr_rdata.vr_rx_ring = NULL; - sc->vr_cdata.vr_rx_ring_map = NULL; + sc->vr_rdata.vr_rx_ring_paddr = 0; bus_dma_tag_destroy(sc->vr_cdata.vr_rx_ring_tag); sc->vr_cdata.vr_rx_ring_tag = NULL; } |