svn commit: r318091 - head/sys/dev/cxgbe
Navdeep Parhar
np at FreeBSD.org
Tue May 9 18:33:43 UTC 2017
Author: np
Date: Tue May 9 18:33:41 2017
New Revision: 318091
URL: https://svnweb.freebsd.org/changeset/base/318091
Log:
cxgbe(4): Do not assume that if_qflush is always followed by inteface-down.
MFC after: 3 days
Sponsored by: Chelsio Communications
Modified:
head/sys/dev/cxgbe/adapter.h
head/sys/dev/cxgbe/t4_main.c
head/sys/dev/cxgbe/t4_sge.c
Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h Tue May 9 18:28:42 2017 (r318090)
+++ head/sys/dev/cxgbe/adapter.h Tue May 9 18:33:41 2017 (r318091)
@@ -399,6 +399,7 @@ enum {
EQ_TYPEMASK = 0x3, /* 2 lsbits hold the type (see above) */
EQ_ALLOCATED = (1 << 2), /* firmware resources allocated */
EQ_ENABLED = (1 << 3), /* open for business */
+ EQ_QFLUSH = (1 << 4), /* if_qflush in progress */
};
/* Listed in order of preference. Update t4_sysctls too if you change these */
Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c Tue May 9 18:28:42 2017 (r318090)
+++ head/sys/dev/cxgbe/t4_main.c Tue May 9 18:33:41 2017 (r318091)
@@ -1869,12 +1869,15 @@ cxgbe_qflush(struct ifnet *ifp)
if (vi->flags & VI_INIT_DONE) {
for_each_txq(vi, i, txq) {
TXQ_LOCK(txq);
- txq->eq.flags &= ~EQ_ENABLED;
+ txq->eq.flags |= EQ_QFLUSH;
TXQ_UNLOCK(txq);
while (!mp_ring_is_idle(txq->r)) {
mp_ring_check_drainage(txq->r, 0);
pause("qflush", 1);
}
+ TXQ_LOCK(txq);
+ txq->eq.flags &= ~EQ_QFLUSH;
+ TXQ_UNLOCK(txq);
}
}
if_qflush(ifp);
Modified: head/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- head/sys/dev/cxgbe/t4_sge.c Tue May 9 18:28:42 2017 (r318090)
+++ head/sys/dev/cxgbe/t4_sge.c Tue May 9 18:33:41 2017 (r318091)
@@ -2452,6 +2452,13 @@ cannot_use_txpkts(struct mbuf *m)
return (needs_tso(m));
}
+static inline int
+discard_tx(struct sge_eq *eq)
+{
+
+ return ((eq->flags & (EQ_ENABLED | EQ_QFLUSH)) != EQ_ENABLED);
+}
+
/*
* r->items[cidx] to r->items[pidx], with a wraparound at r->size, are ready to
* be consumed. Return the actual number consumed. 0 indicates a stall.
@@ -2477,7 +2484,7 @@ eth_tx(struct mp_ring *r, u_int cidx, u_
total = 0;
TXQ_LOCK(txq);
- if (__predict_false((eq->flags & EQ_ENABLED) == 0)) {
+ if (__predict_false(discard_tx(eq))) {
while (cidx != pidx) {
m0 = r->items[cidx];
m_freem(m0);
More information about the svn-src-head
mailing list