Date: Sat, 18 Oct 2014 07:42:58 -0400 From: John Baldwin <jhb@freebsd.org> To: Jason Wolfe <nitroboost@gmail.com> Cc: Sean Bruno <sbruno@llnw.com>, freebsd-net@freebsd.org Subject: Re: ixgbe(4) spin lock held too long Message-ID: <1569387.ZCJSvuukWl@ralph.baldwin.cx> In-Reply-To: <CAAAm0r2Y359AtNyHrZ6J0TVLiws3ZTcfeYdfCimUZ8e1yHf5oA@mail.gmail.com> References: <1410203348.1343.1.camel@bruno> <201410161523.32415.jhb@freebsd.org> <CAAAm0r2Y359AtNyHrZ6J0TVLiws3ZTcfeYdfCimUZ8e1yHf5oA@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Friday, October 17, 2014 11:32:13 PM Jason Wolfe wrote: > Producing 10G of random traffic against a server with this assertion > added took about 2 hours to panic, so if it turns out we need anything > further it should be pretty quick. > > #4 list > 2816 * timer and remember to restart (more output or persist). > 2817 * If there is more data to be acked, restart retransmit > 2818 * timer, using current (possibly backed-off) value. > 2819 */ > 2820 if (th->th_ack == tp->snd_max) { > 2821 tcp_timer_activate(tp, TT_REXMT, 0); > 2822 needoutput = 1; > 2823 } else if (!tcp_timer_active(tp, TT_PERSIST)) > 2824 tcp_timer_activate(tp, TT_REXMT, tp->t_rxtcur); Bah, this is just a bug in my assertion. Rather than having a separate tcp_timer_deactivate() routine, a delta of 0 passed to tcp_timer_activate() means "stop the timer". My assertions were incorrect and need to exclude the stop case. Here is an updated patch (or you can just fix yours locally): Index: tcp_timer.c =================================================================== --- tcp_timer.c (revision 273219) +++ tcp_timer.c (working copy) @@ -869,10 +869,16 @@ tcp_timer_activate(struct tcpcb *tp, int timer_typ case TT_REXMT: t_callout = &tp->t_timers->tt_rexmt; f_callout = tcp_timer_rexmt; + if (callout_active(&tp->t_timers->tt_persist) && + delta != 0) + panic("scheduling retransmit with persist active"); break; case TT_PERSIST: t_callout = &tp->t_timers->tt_persist; f_callout = tcp_timer_persist; + if (callout_active(&tp->t_timers->tt_rexmt) && + delta != 0) + panic("scheduling persist with retransmit active"); break; case TT_KEEP: t_callout = &tp->t_timers->tt_keep; -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1569387.ZCJSvuukWl>