Tue, 03 Nov 2015 17:31:18 +0200 було написано Adrian Chadd <adr...@freebsd.org>:

hiya,

what do people think about this to fix ath(4) transmit errors:

adrian@victoria:~/work/freebsd/head-embedded/src % svn diff sys/dev/ath
Index: sys/dev/ath/if_ath.c
===================================================================
--- sys/dev/ath/if_ath.c        (revision 290048)
+++ sys/dev/ath/if_ath.c        (working copy)
@@ -3320,6 +3320,9 @@
         *
         * Note: if this fails, then the mbufs are freed but
         * not the node reference.
+        *
+        * So, we now have to free the node reference ourselves here
+        * and return OK up to the stack.
         */
        next = m->m_nextpkt;
        if (ath_tx_start(sc, ni, bf, m)) {
@@ -3336,7 +3339,14 @@
                 */
                ath_txfrag_cleanup(sc, &frags, ni);
                ATH_TXBUF_UNLOCK(sc);
-               retval = ENOBUFS;
+
+               /*
+ * XXX: And free the node/return OK; ath_tx_start() may have
+                *      modified the buffer.  We currently have no way to
+ * signify that the mbuf was freed but there was an error.
+                */
+               ieee80211_node_free(ni);
+               retval = 0;
                goto finish;
        }


.. the idea is that we can't return failure once we've called
ath_tx_start(), as the mbuf needs to be consumed. So we return OK and
just count an error.


Yes, I think this (temporary?) workaround should fix the issue.



-adrian
_______________________________________________
freebsd-wireless@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-wireless
To unsubscribe, send any mail to "freebsd-wireless-unsubscr...@freebsd.org"

Reply via email to