Date: Tue, 2 Aug 2005 15:59:51 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 81337 for review Message-ID: <200508021559.j72FxpQV097543@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=81337 Change 81337 by sam@sam_ebb on 2005/08/02 15:59:36 clean ff buffers returned to sc_txbuf so they don't get reclaimed again when the module is unloaded Affected files ... .. //depot/projects/wifi/sys/dev/ath/if_ath.c#96 edit Differences ... ==== //depot/projects/wifi/sys/dev/ath/if_ath.c#96 (text+ko) ==== @@ -1139,13 +1139,15 @@ bad: if (ni != NULL) ieee80211_free_node(ni); - if (bf->bf_m != NULL) + bf->bf_node = NULL; + if (bf->bf_m != NULL) { m_freem(bf->bf_m); - if (bf != NULL) { - ATH_TXBUF_LOCK(sc); - STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); - ATH_TXBUF_UNLOCK(sc); - } + bf->bf_m = NULL; + } + + ATH_TXBUF_LOCK(sc); + STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); + ATH_TXBUF_UNLOCK(sc); } } @@ -1272,11 +1274,13 @@ m->m_nextpkt = NULL; bfstaged->bf_m->m_nextpkt = m; m = bfstaged->bf_m; + bfstaged->bf_m = NULL; m->m_flags |= M_FF; /* * Release the node reference held while * the packet sat on an_ff_buf[] */ + bfstaged->bf_node = NULL; ieee80211_free_node(ni); /* @@ -1349,14 +1353,15 @@ */ if (ni != NULL) ieee80211_free_node(ni); - if (bfstaged->bf_m != NULL) + bfstaged->bf_node = NULL; + if (bfstaged->bf_m != NULL) { m_freem(bfstaged->bf_m); - if (bfstaged != NULL) { - ATH_TXBUF_LOCK(sc); - STAILQ_INSERT_TAIL(&sc->sc_txbuf, - bfstaged, bf_list); - ATH_TXBUF_UNLOCK(sc); + bfstaged->bf_m = NULL; } + + ATH_TXBUF_LOCK(sc); + STAILQ_INSERT_TAIL(&sc->sc_txbuf, bfstaged, bf_list); + ATH_TXBUF_UNLOCK(sc); } else { #if 0 ifp->if_opackets++; @@ -1392,6 +1397,7 @@ ATH_TXBUF_LOCK_ASSERT(sc); STAILQ_FOREACH_SAFE(bf, frags, bf_list, next) { + /* NB: bf assumed clean */ STAILQ_REMOVE_HEAD(frags, bf_list); STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); ieee80211_node_decref(ni); @@ -1605,6 +1611,8 @@ bad: ifp->if_oerrors++; reclaim: + bf->bf_m = NULL; + bf->bf_node = NULL; ATH_TXBUF_LOCK(sc); STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); ath_txfrag_cleanup(sc, &frags, ni); @@ -4380,6 +4388,7 @@ } m_freem(bf->bf_m); bf->bf_m = NULL; + ATH_TXBUF_LOCK(sc); STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); ATH_TXBUF_UNLOCK(sc);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508021559.j72FxpQV097543>