Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Jul 2007 08:55:59 +0800
From:      Xin LI <delphij@delphij.net>
To:        Peter Wemm <peter@wemm.org>
Cc:        Andre Oppermann <andre@freebsd.org>, current@freebsd.org, freebsd-current@freebsd.org, Robert Watson <rwatson@freebsd.org>, net@freebsd.org
Subject:   Re: FreeBSD 7 TCP syncache fix: request for testers
Message-ID:  <46A2AB1F.3060507@delphij.net>
In-Reply-To: <200707201155.44573.peter@wemm.org>
References:  <20070709234401.S29353@odysseus.silby.com>	<20070710132253.GJ1038@void.codelabs.ru>	<20070710202028.I34890@odysseus.silby.com> <200707201155.44573.peter@wemm.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------080503060705080206030802
Content-Type: text/plain; charset=iso-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

I was unable to apply Mike's patch so I have manually applied it.  Here 
is a new one that should apply against today's -CURRENT.

Cheers,

--------------080503060705080206030802
Content-Type: text/x-patch;
 name="tcp_syncache.c-timerfix.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="tcp_syncache.c-timerfix.patch"

Index: tcp_syncache.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_syncache.c,v
retrieving revision 1.123
diff -u -p -r1.123 tcp_syncache.c
--- tcp_syncache.c	3 Jul 2007 12:13:43 -0000	1.123
+++ tcp_syncache.c	21 Jul 2007 16:15:07 -0000
@@ -142,7 +142,6 @@ struct syncache_head {
 	struct mtx	sch_mtx;
 	TAILQ_HEAD(sch_head, syncache)	sch_bucket;
 	struct callout	sch_timer;
-	int		sch_nextc;
 	u_int		sch_length;
 	u_int		sch_oddeven;
 	u_int32_t	sch_secbits_odd[SYNCOOKIE_SECRET_SIZE];
@@ -233,16 +232,10 @@ static MALLOC_DEFINE(M_SYNCACHE, "syncac
 
 #define ENDPTS6_EQ(a, b) (memcmp(a, b, sizeof(*a)) == 0)
 
-#define SYNCACHE_TIMEOUT(sc, sch, co) do {				\
+#define SYNCACHE_TIMEOUT(sc) do {					\
 	(sc)->sc_rxmits++;						\
 	(sc)->sc_rxttime = ticks +					\
 		TCPTV_RTOBASE * tcp_backoff[(sc)->sc_rxmits - 1];	\
-	if ((sch)->sch_nextc > (sc)->sc_rxttime)			\
-		(sch)->sch_nextc = (sc)->sc_rxttime;			\
-	if (!TAILQ_EMPTY(&(sch)->sch_bucket) && !(co))			\
-		callout_reset(&(sch)->sch_timer,			\
-			(sch)->sch_nextc - ticks,			\
-			syncache_timer, (void *)(sch));			\
 } while (0)
 
 #define	SCH_LOCK(sch)		mtx_lock(&(sch)->sch_mtx)
@@ -268,6 +261,7 @@ void
 syncache_init(void)
 {
 	int i;
+	struct syncache_head *sch;
 
 	tcp_syncache.cache_count = 0;
 	tcp_syncache.hashsize = TCP_SYNCACHE_HASHSIZE;
@@ -310,6 +304,17 @@ syncache_init(void)
 	tcp_syncache.zone = uma_zcreate("syncache", sizeof(struct syncache),
 	    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
 	uma_zone_set_max(tcp_syncache.zone, tcp_syncache.cache_limit);
+
+	/*
+	 * Start the syncache head timers running.  They each run ten times
+	 * a second, and are spread out so that they are not all running on
+	 * the same clock tick.
+	 */
+	for (i = 0; i < tcp_syncache.hashsize; i++) {
+		sch = &tcp_syncache.hashbase[i];
+		callout_reset(&(sch)->sch_timer, i * (hz / 10),    
+		syncache_timer, (void *)(sch));
+	}
 }
 
 /*
@@ -339,8 +344,8 @@ syncache_insert(struct syncache *sc, str
 	TAILQ_INSERT_HEAD(&sch->sch_bucket, sc, sc_hash);
 	sch->sch_length++;
 
-	/* Reinitialize the bucket row's timer. */
-	SYNCACHE_TIMEOUT(sc, sch, 1);
+	/* Set the retransmit timer for this socket. */
+	SYNCACHE_TIMEOUT(sc);
 
 	SCH_UNLOCK(sch);
 
@@ -390,11 +395,8 @@ syncache_timer(void *xsch)
 		 * then the RST will be sent by the time the remote
 		 * host does the SYN/ACK->ACK.
 		 */
-		if (sc->sc_rxttime >= tick) {
-			if (sc->sc_rxttime < sch->sch_nextc)
-				sch->sch_nextc = sc->sc_rxttime;
+		if (sc->sc_rxttime >= tick)
 			continue;
-		}
 
 		if (sc->sc_rxmits > tcp_syncache.rexmt_limit) {
 			if ((s = tcp_log_addrs(&sc->sc_inc, NULL, NULL, NULL))) {
@@ -409,11 +411,10 @@ syncache_timer(void *xsch)
 
 		(void) syncache_respond(sc);
 		tcpstat.tcps_sc_retransmitted++;
-		SYNCACHE_TIMEOUT(sc, sch, 0);
+		SYNCACHE_TIMEOUT(sc);
 	}
-	if (!TAILQ_EMPTY(&(sch)->sch_bucket))
-		callout_reset(&(sch)->sch_timer, (sch)->sch_nextc - tick,
-			syncache_timer, (void *)(sch));
+	callout_reset(&(sch)->sch_timer, hz / 10,
+		syncache_timer, (void *)(sch));
 }
 
 /*
@@ -995,7 +996,7 @@ syncache_add(struct in_conninfo *inc, st
 		    ("%s: label not initialized", __func__));
 #endif
 		if (syncache_respond(sc) == 0) {
-			SYNCACHE_TIMEOUT(sc, sch, 1);
+			SYNCACHE_TIMEOUT(sc);
 			tcpstat.tcps_sndacks++;
 			tcpstat.tcps_sndtotal++;
 		}

--------------080503060705080206030802--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?46A2AB1F.3060507>