Date: Sat, 11 Jul 2009 16:01:00 GMT From: Andre Oppermann <andre@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 165934 for review Message-ID: <200907111601.n6BG10i4028386@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=165934 Change 165934 by andre@andre_flirtbox on 2009/07/11 16:00:34 Fixups for RB based SACK scoreboard. Affected files ... .. //depot/projects/tcp_new/netinet/tcp_input.c#13 edit .. //depot/projects/tcp_new/netinet/tcp_output.c#11 edit .. //depot/projects/tcp_new/netinet/tcp_sack.c#5 edit .. //depot/projects/tcp_new/netinet/tcp_subr.c#7 edit .. //depot/projects/tcp_new/netinet/tcp_timer.c#4 edit .. //depot/projects/tcp_new/netinet/tcp_var.h#12 edit Differences ... ==== //depot/projects/tcp_new/netinet/tcp_input.c#13 (text+ko) ==== @@ -1734,7 +1734,7 @@ * Update send SACK information and tell us how much more * data has left the network (relative to last SACK we got). */ - if ((to.to_flags & TOF_SACK) || !TAILQ_EMPTY(&tp->snd_holes)) + if ((to.to_flags & TOF_SACK) || !RB_EMPTY(&tp->snd_sackblocks)) sacked = tcp_sack_doack(tp, &to, th->th_ack); else sacked = 0; ==== //depot/projects/tcp_new/netinet/tcp_output.c#11 (text+ko) ==== ==== //depot/projects/tcp_new/netinet/tcp_sack.c#5 (text+ko) ==== @@ -42,10 +42,14 @@ #include <sys/kernel.h> #include <sys/sysctl.h> #include <sys/proc.h> /* for proc0 declaration */ +#include <sys/socket.h> +#include <sys/socketvar.h> #include <sys/systm.h> #include <vm/uma.h> +#include <net/if.h> + #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> @@ -104,15 +108,15 @@ return (0); } -RB_PROTOTYPE(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp); -RB_GENERATE(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp); +RB_PROTOTYPE_STATIC(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp); +RB_GENERATE_STATIC(tcp_sackblocks, tcp_sack_block, tsb_rb, tcp_sack_cmp); static void -tcp_sack_free(struct tcp_sack_block *tps, struct tcp_sack_block *tsb) +tcp_sack_free(struct tcpcb *tp, struct tcp_sack_block *tsb) { struct tcp_sack_block *sb; - sb = RB_REMOVE(tcp_sackholes, tps, tsb); + sb = RB_REMOVE(tcp_sackblocks, &tp->snd_sackblocks, tsb); KASSERT(sb != NULL, ("%s: RB_REMOVE failed", __func__)); uma_zfree(tcp_sackblock_zone, tsb); } @@ -128,7 +132,7 @@ SEQ_LEQ(tsb->tsb_blk.start, tp->snd_una) || SEQ_GT(tsb->tsb_blk.end, tp->snd_nxt) || (tsbn != NULL && SEQ_GEQ(tsb->tsb_blk.end, tsbn->tsb_blk.start))) - return (0) + return (0); } return (1); } @@ -144,17 +148,17 @@ /* Remove any blocks from the scoreboard when full acked. */ RB_FOREACH_SAFE(tsb, tcp_sackblocks, &tp->snd_sackblocks, tsbn) { - if (SEQ_LT(th_ack, tqe->tsb_blk.start)) + if (SEQ_LT(th_ack, tsb->tsb_blk.start)) break; else RB_REMOVE(tcp_sackblocks, &tp->snd_sackblocks, tsb); } - if ((to->t_flags & TOF_SACK) && to->to_nsacks == 0) { + if ((to->to_flags & TOF_SACK) && to->to_nsacks == 0) { /* remove all sack blocks, strange reneg */ tcp_sack_flush(tp); return (0); - } else if (!(to->t_flags & TOF_SACK)) + } else if (!(to->to_flags & TOF_SACK)) return (0); /* Integrate SACK blocks from segment. */ @@ -172,7 +176,7 @@ continue; /* XXXAO: Implicit-explicit reneg. */ - if (sack.start == sack.end) { + if (sack.tsb_blk.start == sack.tsb_blk.end) { /* Remove all sackblocks. */ tcp_sack_flush(tp); continue; @@ -194,7 +198,7 @@ //sacked -= SEQ_DELTA(sack.tsb_blk.start, tsbn->tsb_blk.start); if (SEQ_GT(tsbn->tsb_blk.end, tsb->tsb_blk.end)) tsb->tsb_blk.end = tsbn->tsb_blk.end; - tcp_sack_free(&tp->snd_sackblocks, tsbn); + tcp_sack_free(tp, tsbn); } } /* Extends the start. */ @@ -206,17 +210,17 @@ //sacked -= SEQ_DELTA(); if (SEQ_LT(tsbn->tsb_blk.start, tsb->tsb_blk.start)) tsb->tsb_blk.start = tsbn->tsb_blk.start; - tcp_sack_free(&tp->snd_sackblocks, tsbn); + tcp_sack_free(tp, tsbn); } } - } else if ((tsb = (struct sackblocks *)uma_zalloc(tcp_sackblock_zone, M_NOWAIT))) != NULL) { + } else if ((tsb = (struct tcp_sack_block *)uma_zalloc(tcp_sackblock_zone, M_NOWAIT)) != NULL) { sacked += SEQ_DELTA(sack.tsb_blk.start, sack.tsb_blk.end); tsb->tsb_blk.start = sack.tsb_blk.start; tsb->tsb_blk.end = sack.tsb_blk.end; tsbn = RB_INSERT(tcp_sackblocks, &tp->snd_sackblocks, tsb); KASSERT(tsbn == NULL, ("%s: RB_INSERT failed", __func__)); - } else - TCPSTAT_INC(); /* failed to allocate sackblock */ + } /*else + TCPSTAT_INC(); */ /* failed to allocate sackblock */ } KASSERT(tcp_sack_verify(tp), @@ -230,9 +234,9 @@ { struct tcp_sack_block *tsb, *tsbn; - RB_FOREACH_SAFE(tsb, tcp_sackholes, &tp->snd_sackholes, tsbn) { - RB_REMOVE(tcp_sackholes, &tp->snd_sackholes, tsb); - uma_zfree(tcp_sackbock_zone, tsb); + RB_FOREACH_SAFE(tsb, tcp_sackblocks, &tp->snd_sackblocks, tsbn) { + RB_REMOVE(tcp_sackblocks, &tp->snd_sackblocks, tsb); + uma_zfree(tcp_sackblock_zone, tsb); } } @@ -247,4 +251,4 @@ tsb->tsb_blk.start, tsb->tsb_blk.end) } } -#endif+#endif ==== //depot/projects/tcp_new/netinet/tcp_subr.c#7 (text+ko) ==== @@ -579,7 +579,7 @@ // tp->t_flags = (TF_REQ_SCALE|TF_REQ_TSTMP); if (tcp_do_sack) tp->t_flags |= TF_SACK_PERMIT; - TAILQ_INIT(&tp->snd_holes); + RB_INIT(&tp->snd_sackblocks); tp->t_inpcb = inp; /* XXX */ /* * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no ==== //depot/projects/tcp_new/netinet/tcp_timer.c#4 (text+ko) ==== @@ -205,7 +205,7 @@ return; } INP_LOCK(inp); - tcp_free_sackholes(tp); + tcp_sack_flush(tp); if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) || !callout_active(&tp->t_timers->tt_2msl)) { INP_UNLOCK(tp->t_inpcb); @@ -408,7 +408,7 @@ return; } callout_deactivate(&tp->t_timers->tt_rexmt); - tcp_free_sackholes(tp); + tcp_sack_flush(tp); /* * Retransmission timer went off. Message has not * been acked within retransmit interval. Back off ==== //depot/projects/tcp_new/netinet/tcp_var.h#12 (text+ko) ==== @@ -34,6 +34,7 @@ #define _NETINET_TCP_VAR_H_ #include <netinet/tcp.h> +#include <sys/tree.h> /* * Kernel variables for tcp. @@ -101,7 +102,7 @@ }; struct tcp_sack_block { - RB_ENTRY(tcp_sackblocks) tsb_rb; /* scoreboard linkage */ + RB_ENTRY(tcp_sack_block) tsb_rb; /* scoreboard linkage */ struct sackblk tsb_blk; }; @@ -253,6 +254,7 @@ RB_HEAD(tcp_sackblocks, tcp_sack_block) snd_sackblocks; int snd_numholes; /* number of holes seen by sender */ int snd_sacked; /* data currently ack'ed through SACK */ + int rcv_numsacks; /* Congestion control algorithms */ tcp_win snd_cwnd_prev; /* cwnd prior to retransmit */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907111601.n6BG10i4028386>