Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758328Ab0BRM4o (ORCPT ); Thu, 18 Feb 2010 07:56:44 -0500 Received: from courier.cs.helsinki.fi ([128.214.9.1]:49046 "EHLO mail.cs.helsinki.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758023Ab0BRM4m (ORCPT ); Thu, 18 Feb 2010 07:56:42 -0500 Date: Thu, 18 Feb 2010 14:56:41 +0200 (EET) From: "=?ISO-8859-15?Q?Ilpo_J=E4rvinen?=" X-X-Sender: ijjarvin@wel-95.cs.helsinki.fi To: Andreas Petlund cc: Netdev , eric.dumazet@gmail.com, hannemann@nets.rwth-aachen.de, LKML , shemminger@vyatta.com, william.allen.simpson@gmail.com, damian@tvk.rwth-aachen.de, ebiederm@xmission.com, David Miller , Franco Fichtner Subject: Re: [net-next PATCH v5 3/3] net: TCP thin dupack In-Reply-To: <4B7D3705.4080803@simula.no> Message-ID: References: <4B7D35A5.10106@simula.no> <4B7D3705.4080803@simula.no> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; boundary="8323329-1561996399-1266497676=:7063" Content-ID: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6118 Lines: 166 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323329-1561996399-1266497676=:7063 Content-Type: TEXT/PLAIN; charset=ISO-8859-15 Content-Transfer-Encoding: 8BIT Content-ID: On Thu, 18 Feb 2010, Andreas Petlund wrote: > This patch enables fast retransmissions after one dupACK for > TCP if the stream is identified as thin. This will reduce > latencies for thin streams that are not able to trigger fast > retransmissions due to high packet interarrival time. This > mechanism is only active if enabled by iocontrol or syscontrol > and the stream is identified as thin. > > > Signed-off-by: Andreas Petlund > --- > Documentation/networking/ip-sysctl.txt | 12 ++++++++++++ > include/linux/tcp.h | 4 +++- > include/net/tcp.h | 1 + > net/ipv4/sysctl_net_ipv4.c | 7 +++++++ > net/ipv4/tcp.c | 7 +++++++ > net/ipv4/tcp_input.c | 12 ++++++++++++ > 6 files changed, 42 insertions(+), 1 deletions(-) > > diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt > index f147310..2571a62 100644 > --- a/Documentation/networking/ip-sysctl.txt > +++ b/Documentation/networking/ip-sysctl.txt > @@ -499,6 +499,18 @@ tcp_thin_linear_timeouts - BOOLEAN > Documentation/networking/tcp-thin.txt > Default: 0 > > +tcp_thin_dupack - BOOLEAN > + Enable dynamic triggering of retransmissions after one dupACK > + for thin streams. If set, a check is performed upon reception > + of a dupACK to determine if the stream is thin (less than 4 > + packets in flight). As long as the stream is found to be thin, > + data is retransmitted on the first received dupACK. This > + improves retransmission latency for non-aggressive thin > + streams, often found to be time-dependent. > + For more information on thin streams, see > + Documentation/networking/tcp-thin.txt > + Default: 0 > + > UDP variables: > > udp_mem - vector of 3 INTEGERs: min, pressure, max > diff --git a/include/linux/tcp.h b/include/linux/tcp.h > index 3ba8b07..a778ee0 100644 > --- a/include/linux/tcp.h > +++ b/include/linux/tcp.h > @@ -104,6 +104,7 @@ enum { > #define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ > #define TCP_COOKIE_TRANSACTIONS 15 /* TCP Cookie Transactions */ > #define TCP_THIN_LINEAR_TIMEOUTS 16 /* Use linear timeouts for thin streams*/ > +#define TCP_THIN_DUPACK 17 /* Fast retrans. after 1 dupack */ > > /* for TCP_INFO socket option */ > #define TCPI_OPT_TIMESTAMPS 1 > @@ -343,7 +344,8 @@ struct tcp_sock { > u8 frto_counter; /* Number of new acks after RTO */ > u8 nonagle : 4,/* Disable Nagle algorithm? */ > thin_lto : 1,/* Use linear timeouts for thin streams */ > - unused : 3; > + thin_dupack : 1,/* Fast retransmit on first dupack */ > + unused : 2; > > /* RTT measurement */ > u32 srtt; /* smoothed round trip time << 3 */ > diff --git a/include/net/tcp.h b/include/net/tcp.h > index 6278fc7..56f0aec 100644 > --- a/include/net/tcp.h > +++ b/include/net/tcp.h > @@ -245,6 +245,7 @@ extern int sysctl_tcp_slow_start_after_idle; > extern int sysctl_tcp_max_ssthresh; > extern int sysctl_tcp_cookie_size; > extern int sysctl_tcp_thin_linear_timeouts; > +extern int sysctl_tcp_thin_dupack; > > extern atomic_t tcp_memory_allocated; > extern struct percpu_counter tcp_sockets_allocated; > diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c > index e6a2460..c1bc074 100644 > --- a/net/ipv4/sysctl_net_ipv4.c > +++ b/net/ipv4/sysctl_net_ipv4.c > @@ -582,6 +582,13 @@ static struct ctl_table ipv4_table[] = { > .mode = 0644, > .proc_handler = proc_dointvec > }, > + { > + .procname = "tcp_thin_dupack", > + .data = &sysctl_tcp_thin_dupack, > + .maxlen = sizeof(int), > + .mode = 0644, > + .proc_handler = proc_dointvec > + }, > { > .procname = "udp_mem", > .data = &sysctl_udp_mem, > diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c > index 21bae9a..5901010 100644 > --- a/net/ipv4/tcp.c > +++ b/net/ipv4/tcp.c > @@ -2236,6 +2236,13 @@ static int do_tcp_setsockopt(struct sock *sk, int level, > tp->thin_lto = val; > break; > > + case TCP_THIN_DUPACK: > + if (val < 0 || val > 1) > + err = -EINVAL; > + else > + tp->thin_dupack = val; > + break; > + > case TCP_CORK: > /* When set indicates to always queue non-full frames. > * Later the user clears this option and we transmit > diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c > index 3fddc69..8d950b9 100644 > --- a/net/ipv4/tcp_input.c > +++ b/net/ipv4/tcp_input.c > @@ -89,6 +89,8 @@ int sysctl_tcp_frto __read_mostly = 2; > int sysctl_tcp_frto_response __read_mostly; > int sysctl_tcp_nometrics_save __read_mostly; > > +int sysctl_tcp_thin_dupack __read_mostly; > + > int sysctl_tcp_moderate_rcvbuf __read_mostly = 1; > int sysctl_tcp_abc __read_mostly; > > @@ -2447,6 +2449,16 @@ static int tcp_time_to_recover(struct sock *sk) > return 1; > } > > + /* If a thin stream is detected, retransmit after first > + * received dupack. Employ only if SACK is supported in order > + * to avoid possible corner-case series of spurious retransmissions > + * Use only if there are no unsent data. > + */ > + if ((tp->thin_dupack || sysctl_tcp_thin_dupack) && > + tcp_stream_is_thin(tp) && tcp_dupack_heuristics(tp) > 1 && > + tcp_is_sack(tp) && sk->sk_send_head == NULL) Use tcp_send_head(sk) instead. > + return 1; > + > return 0; > } Other than that, Acked-by: Ilpo J?rvinen -- i. --8323329-1561996399-1266497676=:7063-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/