Re: tcp_sack_output: Computed sack hole not the same as cached value

From: Mohan Srinivasan <mohan_srinivasan_at_yahoo.com>
Date: Thu, 30 Jun 2005 10:08:36 -0700 (PDT)
This patch (from Noritoshi Demizu) should fix this.
Andrey Chernov reported this as well and the patch fixes 
the problem for him. This will be committed to -current 
shortly.

mohan

Index: netinet/tcp_input.c
===================================================================
RCS file: /home/cvsup/FreeBSD/ncvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.277
diff -u -r1.277 tcp_input.c
--- netinet/tcp_input.c 27 Jun 2005 22:27:42 -0000      1.277
+++ netinet/tcp_input.c 29 Jun 2005 09:42:35 -0000
_at__at_ -1147,7 +1147,8 _at__at_
                            ((!tcp_do_newreno && !tp->sack_enable &&
                              tp->t_dupacks < tcprexmtthresh) ||
                             ((tcp_do_newreno || tp->sack_enable) &&
-                             !IN_FASTRECOVERY(tp) && to.to_nsacks == 0))) {
+                             !IN_FASTRECOVERY(tp) && to.to_nsacks == 0 &&
+                             TAILQ_EMPTY(&tp->snd_holes)))) {
                                KASSERT(headlocked, ("headlocked"));
                                INP_INFO_WUNLOCK(&tcbinfo);
                                headlocked = 0;
_at__at_ -1822,7 +1823,8 _at__at_
                        tcpstat.tcps_rcvacktoomuch++;
                        goto dropafterack;
                }
-               if (tp->sack_enable)
+               if (tp->sack_enable &&
+                   (to.to_nsacks > 0 || !TAILQ_EMPTY(&tp->snd_holes)))
                        tcp_sack_doack(tp, &to, th->th_ack);
                if (SEQ_LEQ(th->th_ack, tp->snd_una)) {  
                        if (tlen == 0 && tiwin == tp->snd_wnd) {
Index: netinet/tcp_subr.c
===================================================================
RCS file: /home/cvsup/FreeBSD/ncvs/src/sys/netinet/tcp_subr.c,v
retrieving revision 1.227
diff -u -r1.227 tcp_subr.c
--- netinet/tcp_subr.c  1 Jun 2005 12:06:07 -0000       1.227
+++ netinet/tcp_subr.c  29 Jun 2005 09:42:35 -0000
_at__at_ -605,8 +605,7 _at__at_
        if (tcp_do_rfc1323)
                tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP);
        tp->sack_enable = tcp_do_sack;
-       if (tp->sack_enable)
-               TAILQ_INIT(&tp->snd_holes);
+       TAILQ_INIT(&tp->snd_holes);
        tp->t_inpcb = inp;      /* XXX */
        /*
         * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no

--- Daniel Eriksson <daniel_k_eriksson_at_telia.com> wrote:

> 
> With latest CURRENT (2005.06.30.12.00.00) I get a ton of these messages
> on the console. 50-100 per minute and that's when load is light. With
> the old kernel (2005.06.23.00.30.00) no such messages show up.
> 
> tcp_sack_output: Computed sack hole not the same as cached value
> 
> This is on an SMP machine. On my UP server I saw no messages, but I only
> had the two machines (one UP and one SMP) running the new kernel for a
> few minutes.
> 
> /Daniel Eriksson
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"
> 
Received on Thu Jun 30 2005 - 15:08:37 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:37 UTC