Index: uipc_mbuf.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.198 diff -u -p -r1.198 uipc_mbuf.c --- uipc_mbuf.c 5 Nov 2014 00:28:15 -0000 1.198 +++ uipc_mbuf.c 1 Dec 2014 00:43:07 -0000 @@ -160,7 +160,6 @@ mbinit(void) mclnames[i], NULL); pool_setipl(&mclpools[i], IPL_NET); pool_set_constraints(&mclpools[i], &kp_dma_contig); - pool_setlowat(&mclpools[i], mcllowat); } nmbclust_update(); @@ -185,7 +184,7 @@ nmbclust_update(void) * allocations in interrupt context don't fail or mclgeti() * drivers may end up with empty rings. */ - pool_sethiwat(&mclpools[i], nmbclust); + // pool_sethiwat(&mclpools[i], nmbclust); } pool_sethiwat(&mbpool, nmbclust); } @@ -1356,14 +1355,24 @@ mq_dequeue(struct mbuf_queue *mq) int mq_enlist(struct mbuf_queue *mq, struct mbuf_list *ml) { - int full; + struct mbuf *m; + int dropped = 0; mtx_enter(&mq->mq_mtx); - ml_join(&mq->mq_list, ml); - full = mq_len(mq) >= mq->mq_maxlen; + if (mq_len(mq) < mq->mq_maxlen) + ml_join(&mq->mq_list, ml); + else { + mq->mq_drops += ml_len(ml); + dropped = 1; + } mtx_leave(&mq->mq_mtx); - return (full); + if (dropped) { + while ((m = ml_dequeue(ml)) != NULL) + m_freem(m); + } + + return (dropped); } void