Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756134AbZJ0QcL (ORCPT ); Tue, 27 Oct 2009 12:32:11 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755505AbZJ0QcK (ORCPT ); Tue, 27 Oct 2009 12:32:10 -0400 Received: from mail-forward1.uio.no ([129.240.10.70]:34951 "EHLO mail-forward1.uio.no" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755864AbZJ0QcG (ORCPT ); Tue, 27 Oct 2009 12:32:06 -0400 Message-ID: <4AE7207D.8090402@simula.no> Date: Tue, 27 Oct 2009 17:31:57 +0100 From: Andreas Petlund User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 To: netdev@vger.kernel.org CC: linux-kernel@vger.kernel.org, shemminger@vyatta.com, ilpo.jarvinen@helsinki.fi, davem@davemloft.net Subject: [PATCH 3/3] net: TCP thin dupack Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-UiO-Ratelimit-Test: rcpts/h 20 msgs/h 4 sum rcpts/h 23 sum msgs/h 5 total rcpts 354 max rcpts/h 20 ratelimit 0 X-UiO-Spam-info: not spam, SpamAssassin (score=-5.0, required=5.0, autolearn=disabled, UIO_MAIL_IS_INTERNAL=-5, uiobl=NO, uiouri=NO) X-UiO-Scanned: 8D7E9FEE2BFFED0B3F12E071F181E4EB5C7AAE5F X-UiO-SPAM-Test: remote_host: 128.39.37.254 spam_score: -49 maxlevel 80 minaction 2 bait 0 mail/h: 5 total 4104 max/h 42 blacklist 0 greylist 0 ratelimit 0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4061 Lines: 117 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 --- include/linux/tcp.h | 4 +++- include/net/tcp.h | 1 + net/ipv4/sysctl_net_ipv4.c | 8 ++++++++ net/ipv4/tcp.c | 5 +++++ net/ipv4/tcp_input.c | 8 ++++++++ 5 files changed, 25 insertions(+), 1 deletions(-) diff --git a/include/linux/tcp.h b/include/linux/tcp.h index e64368d..f4a05ff 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -97,6 +97,7 @@ enum { #define TCP_CONGESTION 13 /* Congestion control algorithm */ #define TCP_MD5SIG 14 /* TCP MD5 Signature (RFC2385) */ #define TCP_THIN_RM_EXPB 15 /* Remove exp. backoff for thin streams*/ +#define TCP_THIN_DUPACK 16 /* Fast retrans. after 1 dupack */ #define TCPI_OPT_TIMESTAMPS 1 #define TCPI_OPT_SACK 2 @@ -301,7 +302,8 @@ struct tcp_sock { u8 frto_counter; /* Number of new acks after RTO */ u8 nonagle; /* Disable Nagle algorithm? */ u8 thin_rm_expb:1, /* Remove exp. backoff for thin streams */ - thin_undef : 7; + thin_dupack : 1,/* Fast retransmit on first dupack */ + thin_undef : 6; /* RTT measurement */ u32 srtt; /* smoothed round trip time << 3 */ diff --git a/include/net/tcp.h b/include/net/tcp.h index 412c1bd..41f3a5e 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -238,6 +238,7 @@ extern int sysctl_tcp_workaround_signed_windows; extern int sysctl_tcp_slow_start_after_idle; extern int sysctl_tcp_max_ssthresh; extern int sysctl_tcp_force_thin_rm_expb; +extern int sysctl_tcp_force_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 7458f37..8653867 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c @@ -721,6 +721,14 @@ static struct ctl_table ipv4_table[] = { .proc_handler = proc_dointvec }, { + .ctl_name = CTL_UNNUMBERED, + .procname = "tcp_force_thin_dupack", + .data = &sysctl_tcp_force_thin_dupack, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec + }, + { .ctl_name = CTL_UNNUMBERED, .procname = "udp_mem", .data = &sysctl_udp_mem, diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index b4b0931..de190db 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2139,6 +2139,11 @@ static int do_tcp_setsockopt(struct sock *sk, int level, tp->thin_rm_expb = 1; break; + case TCP_THIN_DUPACK: + if (val) + tp->thin_dupack = 1; + 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 d86784b..b71eb89 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_force_thin_dupack __read_mostly; + int sysctl_tcp_moderate_rcvbuf __read_mostly = 1; int sysctl_tcp_abc __read_mostly; @@ -2447,6 +2449,12 @@ static int tcp_time_to_recover(struct sock *sk) return 1; } + /* If a thin stream is detected, retransmit after first + * received dupack */ + if ((tp->thin_dupack || sysctl_tcp_force_thin_dupack) && + tcp_dupack_heurestics(tp) > 1 && tcp_stream_is_thin(tp)) + return 1; + return 0; } -- 1.6.0.4 -- 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/