PERFORCE change 123816 for review
Peter Wemm
peter at FreeBSD.org
Fri Jul 20 18:58:15 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123816
Change 123816 by peter at peter_overcee on 2007/07/20 18:57:27
Check in silby's tcp patch.
Affected files ...
.. //depot/projects/hammer/sys/netinet/tcp_syncache.c#44 edit
Differences ...
==== //depot/projects/hammer/sys/netinet/tcp_syncache.c#44 (text+ko) ====
@@ -142,7 +142,6 @@
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 @@
#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 @@
syncache_init(void)
{
int i;
+ struct syncache_head *sch;
tcp_syncache.cache_count = 0;
tcp_syncache.hashsize = TCP_SYNCACHE_HASHSIZE;
@@ -310,6 +304,17 @@
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 @@
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);
@@ -391,8 +396,6 @@
* host does the SYN/ACK->ACK.
*/
if (sc->sc_rxttime >= tick) {
- if (sc->sc_rxttime < sch->sch_nextc)
- sch->sch_nextc = sc->sc_rxttime;
continue;
}
@@ -409,11 +412,10 @@
(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 +997,7 @@
("%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++;
}
More information about the p4-projects
mailing list