diff options
author | davidcs <davidcs@FreeBSD.org> | 2015-06-23 20:09:52 +0000 |
---|---|---|
committer | davidcs <davidcs@FreeBSD.org> | 2015-06-23 20:09:52 +0000 |
commit | cb5e83ba7d7a9fe7b32562a5970e9ee98a259a13 (patch) | |
tree | 01b9be642433f8f4d2cd6630794cfe5c0fd8b55f /sys/dev/bxe | |
parent | d3bae830435e99de517e0ce89f071ba56763bf2c (diff) | |
download | FreeBSD-src-cb5e83ba7d7a9fe7b32562a5970e9ee98a259a13.zip FreeBSD-src-cb5e83ba7d7a9fe7b32562a5970e9ee98a259a13.tar.gz |
tx_mtx should be grabbed before calling buf_ring_dequeue_sc()
Submitted by:Attilio.Rao@isilon.com
MFC after:5 days
Diffstat (limited to 'sys/dev/bxe')
-rw-r--r-- | sys/dev/bxe/bxe.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/dev/bxe/bxe.c b/sys/dev/bxe/bxe.c index 0b26d31..f3e5964 100644 --- a/sys/dev/bxe/bxe.c +++ b/sys/dev/bxe/bxe.c @@ -6547,10 +6547,14 @@ bxe_free_fp_buffers(struct bxe_softc *sc) #if __FreeBSD_version >= 800000 if (fp->tx_br != NULL) { - struct mbuf *m; /* just in case bxe_mq_flush() wasn't called */ - while ((m = buf_ring_dequeue_sc(fp->tx_br)) != NULL) { - m_freem(m); + if (mtx_initialized(&fp->tx_mtx)) { + struct mbuf *m; + + BXE_FP_TX_LOCK(fp); + while ((m = buf_ring_dequeue_sc(fp->tx_br)) != NULL) + m_freem(m); + BXE_FP_TX_UNLOCK(fp); } buf_ring_free(fp->tx_br, M_DEVBUF); fp->tx_br = NULL; |