Commit 1280c262 authored by Eric Dumazet's avatar Eric Dumazet Committed by Paolo Abeni
Browse files

tcp: add tcp_rto_max_ms sysctl



Previous patch added a TCP_RTO_MAX_MS socket option
to tune a TCP socket max RTO value.

Many setups prefer to change a per netns sysctl.

This patch adds /proc/sys/net/ipv4/tcp_rto_max_ms

Its initial value is 120000 (120 seconds).

Keep in mind that a decrease of tcp_rto_max_ms
means shorter overall timeouts, unless tcp_retries2
sysctl is increased.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarJason Xing <kerneljasonxing@gmail.com>
Reviewed-by: default avatarNeal Cardwell <ncardwell@google.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 54a378f4
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -705,6 +705,8 @@ tcp_retries2 - INTEGER
	seconds and is a lower bound for the effective timeout.
	TCP will effectively time out at the first RTO which exceeds the
	hypothetical timeout.
	If tcp_rto_max_ms is decreased, it is recommended to also
	change tcp_retries2.

	RFC 1122 recommends at least 100 seconds for the timeout,
	which corresponds to a value of at least 8.
@@ -1237,6 +1239,17 @@ tcp_rto_min_us - INTEGER

	Default: 200000

tcp_rto_max_ms - INTEGER
	Maximal TCP retransmission timeout (in ms).
	Note that TCP_RTO_MAX_MS socket option has higher precedence.

	When changing tcp_rto_max_ms, it is important to understand
	that tcp_retries2 might need a change.

	Possible Values: 1000 - 120,000

	Default: 120,000

UDP variables
=============

+1 −0
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ u8 sysctl_tcp_sack
u8                              sysctl_tcp_window_scaling                                                            tcp_syn_options,tcp_parse_options
u8                              sysctl_tcp_timestamps
u8                              sysctl_tcp_early_retrans                     read_mostly                             tcp_schedule_loss_probe(tcp_write_xmit)
u32                             sysctl_tcp_rto_max_ms
u8                              sysctl_tcp_recovery                                                                  tcp_fastretrans_alert
u8                              sysctl_tcp_thin_linear_timeouts                                                      tcp_retrans_timer(on_thin_streams)
u8                              sysctl_tcp_slow_start_after_idle                                                     unlikely(tcp_cwnd_validate-network-not-starved)
+1 −0
Original line number Diff line number Diff line
@@ -181,6 +181,7 @@ struct netns_ipv4 {
	u8 sysctl_tcp_window_scaling;
	u8 sysctl_tcp_timestamps;
	int sysctl_tcp_rto_min_us;
	int sysctl_tcp_rto_max_ms;
	u8 sysctl_tcp_recovery;
	u8 sysctl_tcp_thin_linear_timeouts;
	u8 sysctl_tcp_slow_start_after_idle;
+10 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ static int tcp_adv_win_scale_max = 31;
static int tcp_app_win_max = 31;
static int tcp_min_snd_mss_min = TCP_MIN_SND_MSS;
static int tcp_min_snd_mss_max = 65535;
static int tcp_rto_max_max = TCP_RTO_MAX_SEC * MSEC_PER_SEC;
static int ip_privileged_port_min;
static int ip_privileged_port_max = 65535;
static int ip_ttl_min = 1;
@@ -1583,6 +1584,15 @@ static struct ctl_table ipv4_net_table[] = {
		.proc_handler	= proc_dointvec_minmax,
		.extra1		= SYSCTL_ONE,
	},
	{
		.procname	= "tcp_rto_max_ms",
		.data		= &init_net.ipv4.sysctl_tcp_rto_max_ms,
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= proc_dointvec_minmax,
		.extra1		= SYSCTL_ONE_THOUSAND,
		.extra2		= &tcp_rto_max_max,
	},
};

static __net_init int ipv4_sysctl_init_net(struct net *net)
+3 −3
Original line number Diff line number Diff line
@@ -423,7 +423,7 @@ void tcp_init_sock(struct sock *sk)
{
	struct inet_connection_sock *icsk = inet_csk(sk);
	struct tcp_sock *tp = tcp_sk(sk);
	int rto_min_us;
	int rto_min_us, rto_max_ms;

	tp->out_of_order_queue = RB_ROOT;
	sk->tcp_rtx_queue = RB_ROOT;
@@ -433,8 +433,8 @@ void tcp_init_sock(struct sock *sk)

	icsk->icsk_rto = TCP_TIMEOUT_INIT;

	/* Use a sysctl ? */
	icsk->icsk_rto_max = TCP_RTO_MAX;
	rto_max_ms = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rto_max_ms);
	icsk->icsk_rto_max = msecs_to_jiffies(rto_max_ms);

	rto_min_us = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rto_min_us);
	icsk->icsk_rto_min = usecs_to_jiffies(rto_min_us);
Loading