diff options
author | David Gwynne <dlg@cvs.openbsd.org> | 2017-06-12 23:20:11 +0000 |
---|---|---|
committer | David Gwynne <dlg@cvs.openbsd.org> | 2017-06-12 23:20:11 +0000 |
commit | 66b924c817dab83e1ec42bd3c64ad1f2120992c0 (patch) | |
tree | 231ba64c6b4786fc194ddfb6c7a29058e6897a21 /sys/net | |
parent | a658a6c0d73888a468925a1214c1f0499e9af32f (diff) |
have the timeout call if qstart via the serialiser isntead of directly
hfsc schedules a timeout to keep traffic moving if somethings has been
delayed an no other tx activity has occurred. that timeout was calling
(*ifp->if_qstart)(ifq) rather than ifq_start. the latter prevents
concurrent calls to if_qstart.
without this change bjorn ketelaars on misc@ was experiencing weird
pauses in traffic and lockups because the tx ring was corrupted
because re_start was run concurrently, once from the stack and once
from hfsc.
thanks to bjorn ketelaars for debugging, and mikeb@ for most of the
legwork in diagnosing the problem.
ok mikeb@
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/hfsc.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/net/hfsc.c b/sys/net/hfsc.c index 8fddbe5d933..795e42f7f2a 100644 --- a/sys/net/hfsc.c +++ b/sys/net/hfsc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hfsc.c,v 1.39 2017/05/08 11:30:53 mikeb Exp $ */ +/* $OpenBSD: hfsc.c,v 1.40 2017/06/12 23:20:10 dlg Exp $ */ /* * Copyright (c) 2012-2013 Henning Brauer <henning@openbsd.org> @@ -817,7 +817,7 @@ hfsc_deferred(void *arg) KASSERT(HFSC_ENABLED(ifq)); if (!ifq_empty(ifq)) - (*ifp->if_qstart)(ifq); + ifq_start(ifq); hif = ifq->ifq_q; |