From owner-svn-src-head@FreeBSD.ORG Mon Oct 15 04:10:49 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E1ADDB86; Mon, 15 Oct 2012 04:10:49 +0000 (UTC) (envelope-from kientzle@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CA7898FC12; Mon, 15 Oct 2012 04:10:49 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q9F4AnlP009606; Mon, 15 Oct 2012 04:10:49 GMT (envelope-from kientzle@svn.freebsd.org) Received: (from kientzle@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q9F4AnJg009604; Mon, 15 Oct 2012 04:10:49 GMT (envelope-from kientzle@svn.freebsd.org) Message-Id: <201210150410.q9F4AnJg009604@svn.freebsd.org> From: Tim Kientzle Date: Mon, 15 Oct 2012 04:10:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r241572 - head/sys/arm/ti/cpsw X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Oct 2012 04:10:50 -0000 Author: kientzle Date: Mon Oct 15 04:10:49 2012 New Revision: 241572 URL: http://svn.freebsd.org/changeset/base/241572 Log: 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 Modified: head/sys/arm/ti/cpsw/if_cpsw.c Modified: head/sys/arm/ti/cpsw/if_cpsw.c ============================================================================== --- head/sys/arm/ti/cpsw/if_cpsw.c Mon Oct 15 01:13:36 2012 (r241571) +++ head/sys/arm/ti/cpsw/if_cpsw.c Mon Oct 15 04:10:49 2012 (r241572) @@ -522,11 +522,6 @@ cpsw_new_rxbuf(struct cpsw_softc *sc, ui 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 /* 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));