svn commit: r239983 - stable/8/sys/netinet
Bjoern A. Zeeb
bz at FreeBSD.org
Wed Sep 5 15:59:50 UTC 2012
On Sat, 1 Sep 2012, Mikolaj Golub wrote:
> Author: trociny
> Date: Sat Sep 1 10:33:53 2012
> New Revision: 239983
> URL: http://svn.freebsd.org/changeset/base/239983
>
> Log:
> MFC r239075:
>
> In tcp timers, check INP_DROPPED flag a little later, after
> callout_deactivate(), so if INP_DROPPED is set we return with the
> timer active flag cleared.
>
> For me this fixes negative keep timer values reported by `netstat -x'
> for connections in CLOSE state.
panic: Lock tcp not read locked @ /w/src/sys/netinet/tcp_timer.c:497
reproducable on the cluster. Probably wrong all the way up to HEAD?
> Modified:
> stable/8/sys/netinet/tcp_timer.c
> Directory Properties:
> stable/8/sys/ (props changed)
>
> Modified: stable/8/sys/netinet/tcp_timer.c
> ==============================================================================
> --- stable/8/sys/netinet/tcp_timer.c Sat Sep 1 10:32:40 2012 (r239982)
> +++ stable/8/sys/netinet/tcp_timer.c Sat Sep 1 10:33:53 2012 (r239983)
> @@ -176,13 +176,18 @@ tcp_timer_delack(void *xtp)
> return;
> }
> INP_WLOCK(inp);
> - if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_delack)
> - || !callout_active(&tp->t_timers->tt_delack)) {
> + if (callout_pending(&tp->t_timers->tt_delack) ||
> + !callout_active(&tp->t_timers->tt_delack)) {
> INP_WUNLOCK(inp);
> CURVNET_RESTORE();
> return;
> }
> callout_deactivate(&tp->t_timers->tt_delack);
> + if ((inp->inp_flags & INP_DROPPED) != 0) {
> + INP_WUNLOCK(inp);
> + CURVNET_RESTORE();
> + return;
> + }
>
> tp->t_flags |= TF_ACKNOW;
> TCPSTAT_INC(tcps_delack);
> @@ -222,7 +227,7 @@ tcp_timer_2msl(void *xtp)
> }
> INP_WLOCK(inp);
> tcp_free_sackholes(tp);
> - if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) ||
> + if (callout_pending(&tp->t_timers->tt_2msl) ||
> !callout_active(&tp->t_timers->tt_2msl)) {
> INP_WUNLOCK(tp->t_inpcb);
> INP_INFO_WUNLOCK(&V_tcbinfo);
> @@ -230,6 +235,12 @@ tcp_timer_2msl(void *xtp)
> return;
> }
> callout_deactivate(&tp->t_timers->tt_2msl);
> + if ((inp->inp_flags & INP_DROPPED) != 0) {
> + INP_WUNLOCK(inp);
> + INP_INFO_WUNLOCK(&V_tcbinfo);
> + CURVNET_RESTORE();
> + return;
> + }
> /*
> * 2 MSL timeout in shutdown went off. If we're closed but
> * still waiting for peer to close and connection has been idle
> @@ -293,14 +304,20 @@ tcp_timer_keep(void *xtp)
> return;
> }
> INP_WLOCK(inp);
> - if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_keep)
> - || !callout_active(&tp->t_timers->tt_keep)) {
> + if (callout_pending(&tp->t_timers->tt_keep) ||
> + !callout_active(&tp->t_timers->tt_keep)) {
> INP_WUNLOCK(inp);
> INP_INFO_WUNLOCK(&V_tcbinfo);
> CURVNET_RESTORE();
> return;
> }
> callout_deactivate(&tp->t_timers->tt_keep);
> + if ((inp->inp_flags & INP_DROPPED) != 0) {
> + INP_WUNLOCK(inp);
> + INP_INFO_WUNLOCK(&V_tcbinfo);
> + CURVNET_RESTORE();
> + return;
> + }
> /*
> * Keep-alive timer went off; send something
> * or drop connection if idle for too long.
> @@ -388,14 +405,20 @@ tcp_timer_persist(void *xtp)
> return;
> }
> INP_WLOCK(inp);
> - if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_persist)
> - || !callout_active(&tp->t_timers->tt_persist)) {
> + if (callout_pending(&tp->t_timers->tt_persist) ||
> + !callout_active(&tp->t_timers->tt_persist)) {
> INP_WUNLOCK(inp);
> INP_INFO_WUNLOCK(&V_tcbinfo);
> CURVNET_RESTORE();
> return;
> }
> callout_deactivate(&tp->t_timers->tt_persist);
> + if ((inp->inp_flags & INP_DROPPED) != 0) {
> + INP_WUNLOCK(inp);
> + INP_INFO_WUNLOCK(&V_tcbinfo);
> + CURVNET_RESTORE();
> + return;
> + }
> /*
> * Persistance timer into zero window.
> * Force a byte to be output, if possible.
> @@ -461,14 +484,20 @@ tcp_timer_rexmt(void * xtp)
> return;
> }
> INP_WLOCK(inp);
> - if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_rexmt)
> - || !callout_active(&tp->t_timers->tt_rexmt)) {
> + if (callout_pending(&tp->t_timers->tt_rexmt) ||
> + !callout_active(&tp->t_timers->tt_rexmt)) {
> INP_WUNLOCK(inp);
> INP_INFO_WUNLOCK(&V_tcbinfo);
> CURVNET_RESTORE();
> return;
> }
> callout_deactivate(&tp->t_timers->tt_rexmt);
> + if ((inp->inp_flags & INP_DROPPED) != 0) {
> + INP_WUNLOCK(inp);
> + INP_INFO_RUNLOCK(&V_tcbinfo);
> + CURVNET_RESTORE();
> + return;
> + }
> tcp_free_sackholes(tp);
> /*
> * Retransmission timer went off. Message has not
>
--
Bjoern A. Zeeb You have to have visions!
Stop bit received. Insert coin for new address family.
More information about the svn-src-stable-8
mailing list