Skip site navigation (1)Skip section navigation (2)
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>