iflib: Prevent watchdog from resetting idle queues

While changing link state in iflib_link_state_change(), queues are
marked as IFLIB_QUEUE_IDLE to disable watchdog. Currently, iflib_timer()
watchdog does not check for previous queue status before marking it as
IFLIB_QUEUE_HUNG.

This patch adds check of queue status before marking it as hung.

Signed-off-by: Piotr Pietruszewski <[email protected]>

PR:		239240
Submitted by:	Piotr Pietruszewski <[email protected]>
Reported by:	ultima@
Reviewed by:	gallatin@, erj@
MFC after:	3 days
Sponsored by:	Intel Corporation
Differential Revision:	https://reviews.freebsd.org/D21712
This commit is contained in:
Eric Joyner committed 2020-01-02 23:35:06 +00:00
1 parent ab43ce7a22
commit f6afed726b
1 file changed
+4 -1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=356310
+4 -1
View File
@@ -2263,8 +2263,11 @@ iflib_timer(void *arg)
(sctx->isc_pause_frames == 0)))
goto hung;
if (ifmp_ring_is_stalled(txq->ift_br))
if (txq->ift_qstatus != IFLIB_QUEUE_IDLE &&
ifmp_ring_is_stalled(txq->ift_br)) {
KASSERT(ctx->ifc_link_state == LINK_STATE_UP, ("queue can't be marked as hung if interface is down"));
txq->ift_qstatus = IFLIB_QUEUE_HUNG;
}
txq->ift_cleaned_prev = txq->ift_cleaned;
}
#ifdef DEV_NETMAP