Commit 35089bb2 authored by David S. Miller's avatar David S. Miller

[TCP]: Add tcp_slow_start_after_idle sysctl.

A lot of people have asked for a way to disable tcp_cwnd_restart(),
and it seems reasonable to add a sysctl to do that.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9e1881de
...@@ -362,6 +362,13 @@ tcp_workaround_signed_windows - BOOLEAN ...@@ -362,6 +362,13 @@ tcp_workaround_signed_windows - BOOLEAN
not receive a window scaling option from them. not receive a window scaling option from them.
Default: 0 Default: 0
tcp_slow_start_after_idle - BOOLEAN
If set, provide RFC2861 behavior and time out the congestion
window after an idle period. An idle period is defined at
the current RTO. If unset, the congestion window will not
be timed out after an idle period.
Default: 1
IP Variables: IP Variables:
ip_local_port_range - 2 INTEGERS ip_local_port_range - 2 INTEGERS
......
...@@ -405,6 +405,7 @@ enum ...@@ -405,6 +405,7 @@ enum
NET_TCP_BASE_MSS=114, NET_TCP_BASE_MSS=114,
NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115, NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS=115,
NET_TCP_DMA_COPYBREAK=116, NET_TCP_DMA_COPYBREAK=116,
NET_TCP_SLOW_START_AFTER_IDLE=117,
}; };
enum { enum {
......
...@@ -227,6 +227,7 @@ extern int sysctl_tcp_abc; ...@@ -227,6 +227,7 @@ extern int sysctl_tcp_abc;
extern int sysctl_tcp_mtu_probing; extern int sysctl_tcp_mtu_probing;
extern int sysctl_tcp_base_mss; extern int sysctl_tcp_base_mss;
extern int sysctl_tcp_workaround_signed_windows; extern int sysctl_tcp_workaround_signed_windows;
extern int sysctl_tcp_slow_start_after_idle;
extern atomic_t tcp_memory_allocated; extern atomic_t tcp_memory_allocated;
extern atomic_t tcp_sockets_allocated; extern atomic_t tcp_sockets_allocated;
......
...@@ -690,6 +690,14 @@ ctl_table ipv4_table[] = { ...@@ -690,6 +690,14 @@ ctl_table ipv4_table[] = {
.proc_handler = &proc_dointvec .proc_handler = &proc_dointvec
}, },
#endif #endif
{
.ctl_name = NET_TCP_SLOW_START_AFTER_IDLE,
.procname = "tcp_slow_start_after_idle",
.data = &sysctl_tcp_slow_start_after_idle,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &proc_dointvec
},
{ .ctl_name = 0 } { .ctl_name = 0 }
}; };
......
...@@ -59,6 +59,9 @@ int sysctl_tcp_tso_win_divisor = 3; ...@@ -59,6 +59,9 @@ int sysctl_tcp_tso_win_divisor = 3;
int sysctl_tcp_mtu_probing = 0; int sysctl_tcp_mtu_probing = 0;
int sysctl_tcp_base_mss = 512; int sysctl_tcp_base_mss = 512;
/* By default, RFC2861 behavior. */
int sysctl_tcp_slow_start_after_idle = 1;
static void update_send_head(struct sock *sk, struct tcp_sock *tp, static void update_send_head(struct sock *sk, struct tcp_sock *tp,
struct sk_buff *skb) struct sk_buff *skb)
{ {
...@@ -138,7 +141,8 @@ static void tcp_event_data_sent(struct tcp_sock *tp, ...@@ -138,7 +141,8 @@ static void tcp_event_data_sent(struct tcp_sock *tp,
struct inet_connection_sock *icsk = inet_csk(sk); struct inet_connection_sock *icsk = inet_csk(sk);
const u32 now = tcp_time_stamp; const u32 now = tcp_time_stamp;
if (!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto) if (sysctl_tcp_slow_start_after_idle &&
(!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto))
tcp_cwnd_restart(sk, __sk_dst_get(sk)); tcp_cwnd_restart(sk, __sk_dst_get(sk));
tp->lsndtime = now; tp->lsndtime = now;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment