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)
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

index 8fddbe5..795e42f 100644 (file)
@@ -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;