Date: Tue, 17 Jun 2014 14:47:49 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r267580 - in head/sys/dev: cadence et oce ti txp wpi Message-ID: <201406171447.s5HElnZE019075@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhb Date: Tue Jun 17 14:47:49 2014 New Revision: 267580 URL: http://svnweb.freebsd.org/changeset/base/267580 Log: Fix teardown of static DMA allocations in various NIC drivers: - Add missing calls to bus_dmamap_unload() in et(4). - Check the bus address against 0 to decide when to call bus_dmamap_unload() instead of comparing the bus_dma map against NULL. - Check the virtual address against NULL to decide when to call bus_dmamem_free() instead of comparing the bus_dma map against NULL. - Don't clear bus_dma map pointers to NULL for static allocations. Instead, treat the value as completely opaque. - Pass the correct virtual address to bus_dmamem_free() in wpi(4) instead of trying to free a pointer to the virtual address. Reviewed by: yongari Modified: head/sys/dev/cadence/if_cgem.c head/sys/dev/et/if_et.c head/sys/dev/oce/oce_util.c head/sys/dev/ti/if_ti.c head/sys/dev/txp/if_txp.c head/sys/dev/wpi/if_wpi.c Modified: head/sys/dev/cadence/if_cgem.c ============================================================================== --- head/sys/dev/cadence/if_cgem.c Tue Jun 17 13:14:31 2014 (r267579) +++ head/sys/dev/cadence/if_cgem.c Tue Jun 17 14:47:49 2014 (r267580) @@ -1314,10 +1314,14 @@ cgem_detach(device_t dev) } /* Release DMA resources. */ - if (sc->rxring_dma_map != NULL) { + if (sc->rxring != NULL) { + if (sc->rxring_physaddr != 0) { + bus_dmamap_unload(sc->desc_dma_tag, sc->rxring_dma_map); + sc->rxring_physaddr = 0; + } bus_dmamem_free(sc->desc_dma_tag, sc->rxring, sc->rxring_dma_map); - sc->rxring_dma_map = NULL; + sc->rxring = NULL; for (i = 0; i < CGEM_NUM_RX_DESCS; i++) if (sc->rxring_m_dmamap[i] != NULL) { bus_dmamap_destroy(sc->mbuf_dma_tag, @@ -1325,10 +1329,14 @@ cgem_detach(device_t dev) sc->rxring_m_dmamap[i] = NULL; } } - if (sc->txring_dma_map != NULL) { + if (sc->txring != NULL) { + if (sc->txring_physaddr != 0) { + bus_dmamap_unload(sc->desc_dma_tag, sc->txring_dma_map); + sc->txring_physaddr = 0; + } bus_dmamem_free(sc->desc_dma_tag, sc->txring, sc->txring_dma_map); - sc->txring_dma_map = NULL; + sc->txring = NULL; for (i = 0; i < CGEM_NUM_TX_DESCS; i++) if (sc->txring_m_dmamap[i] != NULL) { bus_dmamap_destroy(sc->mbuf_dma_tag, Modified: head/sys/dev/et/if_et.c ============================================================================== --- head/sys/dev/et/if_et.c Tue Jun 17 13:14:31 2014 (r267579) +++ head/sys/dev/et/if_et.c Tue Jun 17 14:47:49 2014 (r267580) @@ -120,7 +120,7 @@ static int et_dma_ring_alloc(struct et_s bus_dma_tag_t *, uint8_t **, bus_dmamap_t *, bus_addr_t *, const char *); static void et_dma_ring_free(struct et_softc *, bus_dma_tag_t *, uint8_t **, - bus_dmamap_t *); + bus_dmamap_t, bus_addr_t *); static void et_init_tx_ring(struct et_softc *); static int et_init_rx_ring(struct et_softc *); static void et_free_tx_ring(struct et_softc *); @@ -841,15 +841,16 @@ et_dma_ring_alloc(struct et_softc *sc, b static void et_dma_ring_free(struct et_softc *sc, bus_dma_tag_t *tag, uint8_t **ring, - bus_dmamap_t *map) + bus_dmamap_t map, bus_addr_t *paddr) { - if (*map != NULL) - bus_dmamap_unload(*tag, *map); - if (*map != NULL && *ring != NULL) { - bus_dmamem_free(*tag, *ring, *map); + if (*paddr != 0) { + bus_dmamap_unload(*tag, map); + *paddr = 0; + } + if (*ring != NULL) { + bus_dmamem_free(*tag, *ring, map); *ring = NULL; - *map = NULL; } if (*tag) { bus_dma_tag_destroy(*tag); @@ -1101,27 +1102,27 @@ et_dma_free(struct et_softc *sc) /* Destroy mini RX ring, ring 0. */ rx_ring = &sc->sc_rx_ring[0]; et_dma_ring_free(sc, &rx_ring->rr_dtag, (void *)&rx_ring->rr_desc, - &rx_ring->rr_dmap); + rx_ring->rr_dmap, &rx_ring->rr_paddr); /* Destroy standard RX ring, ring 1. */ rx_ring = &sc->sc_rx_ring[1]; et_dma_ring_free(sc, &rx_ring->rr_dtag, (void *)&rx_ring->rr_desc, - &rx_ring->rr_dmap); + rx_ring->rr_dmap, &rx_ring->rr_paddr); /* Destroy RX stat ring. */ rxst_ring = &sc->sc_rxstat_ring; et_dma_ring_free(sc, &rxst_ring->rsr_dtag, (void *)&rxst_ring->rsr_stat, - &rxst_ring->rsr_dmap); + rxst_ring->rsr_dmap, &rxst_ring->rsr_paddr); /* Destroy RX status block. */ rxsd = &sc->sc_rx_status; et_dma_ring_free(sc, &rxst_ring->rsr_dtag, (void *)&rxst_ring->rsr_stat, - &rxst_ring->rsr_dmap); + rxst_ring->rsr_dmap, &rxst_ring->rsr_paddr); /* Destroy TX ring. */ tx_ring = &sc->sc_tx_ring; et_dma_ring_free(sc, &tx_ring->tr_dtag, (void *)&tx_ring->tr_desc, - &tx_ring->tr_dmap); + tx_ring->tr_dmap, &tx_ring->tr_paddr); /* Destroy TX status block. */ txsd = &sc->sc_tx_status; et_dma_ring_free(sc, &txsd->txsd_dtag, (void *)&txsd->txsd_status, - &txsd->txsd_dmap); + txsd->txsd_dmap, &txsd->txsd_paddr); /* Destroy the parent tag. */ if (sc->sc_dtag) { Modified: head/sys/dev/oce/oce_util.c ============================================================================== --- head/sys/dev/oce/oce_util.c Tue Jun 17 13:14:31 2014 (r267579) +++ head/sys/dev/oce/oce_util.c Tue Jun 17 14:47:49 2014 (r267580) @@ -105,15 +105,15 @@ oce_dma_free(POCE_SOFTC sc, POCE_DMA_MEM if (dma->tag == NULL) return; - if (dma->map != NULL) { + if (dma->paddr != 0) { bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(dma->tag, dma->map); + dma->paddr = 0; } if (dma->ptr != NULL) { bus_dmamem_free(dma->tag, dma->ptr, dma->map); - dma->map = NULL; dma->ptr = NULL; } Modified: head/sys/dev/ti/if_ti.c ============================================================================== --- head/sys/dev/ti/if_ti.c Tue Jun 17 13:14:31 2014 (r267579) +++ head/sys/dev/ti/if_ti.c Tue Jun 17 14:47:49 2014 (r267580) @@ -227,7 +227,7 @@ static void ti_dma_free(struct ti_softc static int ti_dma_ring_alloc(struct ti_softc *, bus_size_t, bus_size_t, bus_dma_tag_t *, uint8_t **, bus_dmamap_t *, bus_addr_t *, const char *); static void ti_dma_ring_free(struct ti_softc *, bus_dma_tag_t *, uint8_t **, - bus_dmamap_t *); + bus_dmamap_t, bus_addr_t *); static int ti_newbuf_std(struct ti_softc *, int); static int ti_newbuf_mini(struct ti_softc *, int); static int ti_newbuf_jumbo(struct ti_softc *, int, struct mbuf *); @@ -1035,15 +1035,16 @@ ti_dma_ring_alloc(struct ti_softc *sc, b static void ti_dma_ring_free(struct ti_softc *sc, bus_dma_tag_t *tag, uint8_t **ring, - bus_dmamap_t *map) + bus_dmamap_t map, bus_addr_t *paddr) { - if (*map != NULL) - bus_dmamap_unload(*tag, *map); - if (*map != NULL && *ring != NULL) { - bus_dmamem_free(*tag, *ring, *map); + if (*paddr != 0) { + bus_dmamap_unload(*tag, map); + *paddr = 0; + } + if (*ring != NULL) { + bus_dmamem_free(*tag, *ring, map); *ring = NULL; - *map = NULL; } if (*tag) { bus_dma_tag_destroy(*tag); @@ -1336,32 +1337,39 @@ ti_dma_free(struct ti_softc *sc) /* Destroy standard RX ring. */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_rx_std_ring_tag, (void *)&sc->ti_rdata.ti_rx_std_ring, - &sc->ti_cdata.ti_rx_std_ring_map); + sc->ti_cdata.ti_rx_std_ring_map, + &sc->ti_rdata.ti_rx_std_ring_paddr); /* Destroy jumbo RX ring. */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_rx_jumbo_ring_tag, (void *)&sc->ti_rdata.ti_rx_jumbo_ring, - &sc->ti_cdata.ti_rx_jumbo_ring_map); + sc->ti_cdata.ti_rx_jumbo_ring_map, + &sc->ti_rdata.ti_rx_jumbo_ring_paddr); /* Destroy mini RX ring. */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_rx_mini_ring_tag, (void *)&sc->ti_rdata.ti_rx_mini_ring, - &sc->ti_cdata.ti_rx_mini_ring_map); + sc->ti_cdata.ti_rx_mini_ring_map, + &sc->ti_rdata.ti_rx_mini_ring_paddr); /* Destroy RX return ring. */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_rx_return_ring_tag, (void *)&sc->ti_rdata.ti_rx_return_ring, - &sc->ti_cdata.ti_rx_return_ring_map); + sc->ti_cdata.ti_rx_return_ring_map, + &sc->ti_rdata.ti_rx_return_ring_paddr); /* Destroy TX ring. */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_tx_ring_tag, - (void *)&sc->ti_rdata.ti_tx_ring, &sc->ti_cdata.ti_tx_ring_map); + (void *)&sc->ti_rdata.ti_tx_ring, sc->ti_cdata.ti_tx_ring_map, + &sc->ti_rdata.ti_tx_ring_paddr); /* Destroy status block. */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_status_tag, - (void *)&sc->ti_rdata.ti_status, &sc->ti_cdata.ti_status_map); + (void *)&sc->ti_rdata.ti_status, sc->ti_cdata.ti_status_map, + &sc->ti_rdata.ti_status_paddr); /* Destroy event ring. */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_event_ring_tag, (void *)&sc->ti_rdata.ti_event_ring, - &sc->ti_cdata.ti_event_ring_map); + sc->ti_cdata.ti_event_ring_map, &sc->ti_rdata.ti_event_ring_paddr); /* Destroy GIB */ ti_dma_ring_free(sc, &sc->ti_cdata.ti_gib_tag, - (void *)&sc->ti_rdata.ti_info, &sc->ti_cdata.ti_gib_map); + (void *)&sc->ti_rdata.ti_info, sc->ti_cdata.ti_gib_map, + &sc->ti_rdata.ti_info_paddr); /* Destroy the parent tag. */ if (sc->ti_cdata.ti_parent_tag) { Modified: head/sys/dev/txp/if_txp.c ============================================================================== --- head/sys/dev/txp/if_txp.c Tue Jun 17 13:14:31 2014 (r267579) +++ head/sys/dev/txp/if_txp.c Tue Jun 17 14:47:49 2014 (r267580) @@ -169,8 +169,8 @@ static int txp_alloc_rings(struct txp_so static void txp_init_rings(struct txp_softc *); static int txp_dma_alloc(struct txp_softc *, char *, bus_dma_tag_t *, bus_size_t, bus_size_t, bus_dmamap_t *, void **, bus_size_t, bus_addr_t *); -static void txp_dma_free(struct txp_softc *, bus_dma_tag_t *, bus_dmamap_t *, - void **); +static void txp_dma_free(struct txp_softc *, bus_dma_tag_t *, bus_dmamap_t, + void **, bus_addr_t *); static void txp_free_rings(struct txp_softc *); static int txp_rxring_fill(struct txp_softc *); static void txp_rxring_empty(struct txp_softc *); @@ -787,7 +787,7 @@ txp_download_fw_section(struct txp_softc bus_dmamap_sync(sec_tag, sec_map, BUS_DMASYNC_POSTWRITE); bail: - txp_dma_free(sc, &sec_tag, &sec_map, (void **)&sec_buf); + txp_dma_free(sc, &sec_tag, sec_map, (void **)&sec_buf, &sec_paddr); return (err); } @@ -1265,17 +1265,17 @@ txp_dma_alloc(struct txp_softc *sc, char } static void -txp_dma_free(struct txp_softc *sc, bus_dma_tag_t *tag, bus_dmamap_t *map, - void **buf) +txp_dma_free(struct txp_softc *sc, bus_dma_tag_t *tag, bus_dmamap_t map, + void **buf, bus_addr_t *paddr) { if (*tag != NULL) { - if (*map != NULL) - bus_dmamap_unload(*tag, *map); - if (*map != NULL && buf != NULL) - bus_dmamem_free(*tag, *(uint8_t **)buf, *map); + if (*paddr != 0) + bus_dmamap_unload(*tag, map); + if (buf != NULL) + bus_dmamem_free(*tag, *(uint8_t **)buf, map); *(uint8_t **)buf = NULL; - *map = NULL; + *paddr = 0; bus_dma_tag_destroy(*tag); *tag = NULL; } @@ -1649,38 +1649,48 @@ txp_free_rings(struct txp_softc *sc) /* Hi priority Tx ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_txhiring_tag, - &sc->sc_cdata.txp_txhiring_map, - (void **)&sc->sc_ldata.txp_txhiring); + sc->sc_cdata.txp_txhiring_map, + (void **)&sc->sc_ldata.txp_txhiring, + &sc->sc_ldata.txp_txhiring_paddr); /* Low priority Tx ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_txloring_tag, - &sc->sc_cdata.txp_txloring_map, - (void **)&sc->sc_ldata.txp_txloring); + sc->sc_cdata.txp_txloring_map, + (void **)&sc->sc_ldata.txp_txloring, + &sc->sc_ldata.txp_txloring_paddr); /* Hi priority Rx ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_rxhiring_tag, - &sc->sc_cdata.txp_rxhiring_map, - (void **)&sc->sc_ldata.txp_rxhiring); + sc->sc_cdata.txp_rxhiring_map, + (void **)&sc->sc_ldata.txp_rxhiring, + &sc->sc_ldata.txp_rxhiring_paddr); /* Low priority Rx ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_rxloring_tag, - &sc->sc_cdata.txp_rxloring_map, - (void **)&sc->sc_ldata.txp_rxloring); + sc->sc_cdata.txp_rxloring_map, + (void **)&sc->sc_ldata.txp_rxloring, + &sc->sc_ldata.txp_rxloring_paddr); /* Receive buffer ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_rxbufs_tag, - &sc->sc_cdata.txp_rxbufs_map, (void **)&sc->sc_ldata.txp_rxbufs); + sc->sc_cdata.txp_rxbufs_map, (void **)&sc->sc_ldata.txp_rxbufs, + &sc->sc_ldata.txp_rxbufs_paddr); /* Command ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_cmdring_tag, - &sc->sc_cdata.txp_cmdring_map, (void **)&sc->sc_ldata.txp_cmdring); + sc->sc_cdata.txp_cmdring_map, (void **)&sc->sc_ldata.txp_cmdring, + &sc->sc_ldata.txp_cmdring_paddr); /* Response ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_rspring_tag, - &sc->sc_cdata.txp_rspring_map, (void **)&sc->sc_ldata.txp_rspring); + sc->sc_cdata.txp_rspring_map, (void **)&sc->sc_ldata.txp_rspring, + &sc->sc_ldata.txp_rspring_paddr); /* Zero ring. */ txp_dma_free(sc, &sc->sc_cdata.txp_zero_tag, - &sc->sc_cdata.txp_zero_map, (void **)&sc->sc_ldata.txp_zero); + sc->sc_cdata.txp_zero_map, (void **)&sc->sc_ldata.txp_zero, + &sc->sc_ldata.txp_zero_paddr); /* Host variables. */ txp_dma_free(sc, &sc->sc_cdata.txp_hostvar_tag, - &sc->sc_cdata.txp_hostvar_map, (void **)&sc->sc_ldata.txp_hostvar); + sc->sc_cdata.txp_hostvar_map, (void **)&sc->sc_ldata.txp_hostvar, + &sc->sc_ldata.txp_hostvar_paddr); /* Boot record. */ txp_dma_free(sc, &sc->sc_cdata.txp_boot_tag, - &sc->sc_cdata.txp_boot_map, (void **)&sc->sc_ldata.txp_boot); + sc->sc_cdata.txp_boot_map, (void **)&sc->sc_ldata.txp_boot, + &sc->sc_ldata.txp_boot_paddr); if (sc->sc_cdata.txp_parent_tag != NULL) { bus_dma_tag_destroy(sc->sc_cdata.txp_parent_tag); Modified: head/sys/dev/wpi/if_wpi.c ============================================================================== --- head/sys/dev/wpi/if_wpi.c Tue Jun 17 13:14:31 2014 (r267579) +++ head/sys/dev/wpi/if_wpi.c Tue Jun 17 14:47:49 2014 (r267580) @@ -901,13 +901,13 @@ static void wpi_dma_contig_free(struct wpi_dma_info *dma) { if (dma->tag) { - if (dma->map != NULL) { + if (dma->vaddr_start != NULL) { if (dma->paddr_start != 0) { bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(dma->tag, dma->map); } - bus_dmamem_free(dma->tag, &dma->vaddr_start, dma->map); + bus_dmamem_free(dma->tag, dma->vaddr_start, dma->map); } bus_dma_tag_destroy(dma->tag); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406171447.s5HElnZE019075>