have the timeout call if qstart via the serialiser isntead of directly
authordlg <dlg@openbsd.org>
Mon, 12 Jun 2017 23:20:10 +0000 (23:20 +0000)
committerdlg <dlg@openbsd.org>
Mon, 12 Jun 2017 23:20:10 +0000 (23:20 +0000)
commita6267f385ffe4a696c1087b00e37703f0499fd23
treebdacdac18ddd3edaa438a40ea874b87c0515ad09
parent8df710b01207a4ee6c9e416b01e63ef5125e7a5a
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@
sys/net/hfsc.c