1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-29 12:03:03 +00:00

Fix an mbuf leak in cpsw driver, clean up mbuf management:

* Record TX mbufs when we get them so we can release them.
 * Set TX/RX mbuf slots to NULL when we are no longer responsible for them
 * Move dma sync on RX into RX intr routine
This commit is contained in:
Tim Kientzle 2012-10-15 04:10:49 +00:00
parent e6f3cb32cc
commit 83e5430018
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=241572

View File

@ -522,11 +522,6 @@ cpsw_new_rxbuf(struct cpsw_softc *sc, uint32_t i, uint32_t next)
int error;
int nsegs;
if (sc->rx_mbuf[i]) {
bus_dmamap_sync(sc->mbuf_dtag, sc->rx_dmamap[i], BUS_DMASYNC_POSTREAD);
bus_dmamap_unload(sc->mbuf_dtag, sc->rx_dmamap[i]);
}
sc->rx_mbuf[i] = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
if (sc->rx_mbuf[i] == NULL)
return (ENOBUFS);
@ -593,6 +588,7 @@ cpsw_encap(struct cpsw_softc *sc, struct mbuf *m0)
/* Write descriptor */
cpsw_cpdma_write_txbd(idx, &bd);
sc->tx_mbuf[idx] = m0;
/* Previous descriptor should point to us */
cpsw_cpdma_write_txbd_next(((idx-1<0)?(CPSW_MAX_TX_BUFFERS-1):(idx-1)),
@ -821,9 +817,15 @@ cpsw_intr_rx_locked(void *arg)
}
}
bus_dmamap_sync(sc->mbuf_dtag,
sc->rx_dmamap[i],
BUS_DMASYNC_POSTREAD);
bus_dmamap_unload(sc->mbuf_dtag, sc->rx_dmamap[i]);
/* Handover packet */
CPSW_RX_UNLOCK(sc);
(*ifp->if_input)(ifp, sc->rx_mbuf[i]);
sc->rx_mbuf[i] = NULL;
CPSW_RX_LOCK(sc);
/* Allocate new buffer for current descriptor */
@ -890,6 +892,7 @@ cpsw_intr_tx_locked(void *arg)
BUS_DMASYNC_POSTWRITE);
bus_dmamap_unload(sc->mbuf_dtag, sc->tx_dmamap[sc->txbd_head]);
m_freem(sc->tx_mbuf[sc->txbd_head]);
sc->tx_mbuf[sc->txbd_head] = NULL;
cpsw_write_4(CPSW_CPDMA_TX_CP(0), cpsw_cpdma_txbd_paddr(sc->txbd_head));