[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: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9e1881dec9
commit
35089bb203
5 changed files with 22 additions and 1 deletions
|
@ -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
|
||||||
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;
|
||||||
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[] = {
|
||||||
.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;
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue