Skip site navigation (1)Skip section navigation (2)
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>