ixgbe(4) spin lock held too long
John Baldwin
jhb at freebsd.org
Sat Oct 18 11:56:49 UTC 2014
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
More information about the freebsd-net
mailing list