svn commit: r316278 - head/sys/net
Sean Bruno
sbruno at FreeBSD.org
Thu Mar 30 16:03:52 UTC 2017
Author: sbruno
Date: Thu Mar 30 16:03:51 2017
New Revision: 316278
URL: https://svnweb.freebsd.org/changeset/base/316278
Log:
Assert IFF_DRV_OACTIVE in iflib_timer() when the "hung" case is detected
so that iflib's admin task can still process the reset directive and restore
functionality.
Sponsored by: Limelight Networks
Modified:
head/sys/net/iflib.c
Modified: head/sys/net/iflib.c
==============================================================================
--- head/sys/net/iflib.c Thu Mar 30 15:05:58 2017 (r316277)
+++ head/sys/net/iflib.c Thu Mar 30 16:03:51 2017 (r316278)
@@ -2114,7 +2114,7 @@ iflib_timer(void *arg)
return;
hung:
CTX_LOCK(ctx);
- if_setdrvflagbits(ctx->ifc_ifp, 0, IFF_DRV_RUNNING);
+ if_setdrvflagbits(ctx->ifc_ifp, IFF_DRV_OACTIVE, IFF_DRV_RUNNING);
device_printf(ctx->ifc_dev, "TX(%d) desc avail = %d, pidx = %d\n",
txq->ift_id, TXQ_AVAIL(txq), txq->ift_pidx);
@@ -3516,8 +3516,11 @@ _task_fn_admin(void *context)
iflib_txq_t txq;
int i;
- if (!(if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_RUNNING))
- return;
+ if (!(if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_RUNNING)) {
+ if (!(if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_OACTIVE)) {
+ return;
+ }
+ }
CTX_LOCK(ctx);
for (txq = ctx->ifc_txqs, i = 0; i < sctx->isc_ntxqsets; i++, txq++) {
More information about the svn-src-all
mailing list