]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: add sysctl_tcp_rto_min_us
authorKevin Yang <yyd@google.com>
Mon, 3 Jun 2024 21:30:54 +0000 (21:30 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Jun 2024 12:42:54 +0000 (13:42 +0100)
Adding a sysctl knob to allow user to specify a default
rto_min at socket init time, other than using the hard
coded 200ms default rto_min.

Note that the rto_min route option has the highest precedence
for configuring this setting, followed by the TCP_BPF_RTO_MIN
socket option, followed by the tcp_rto_min_us sysctl.

Signed-off-by: Kevin Yang <yyd@google.com>
Reviewed-by: Neal Cardwell <ncardwell@google.com>
Reviewed-by: Yuchung Cheng <ycheng@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Tony Lu <tonylu@linux.alibaba.com>
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/ip-sysctl.rst
include/net/netns/ipv4.h
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_ipv4.c

index bd50df6a5a42e6f38e97e63050b2036eb3ebf897..6e99eccdb837c12044697f113c5f148829413072 100644 (file)
@@ -1196,6 +1196,19 @@ tcp_pingpong_thresh - INTEGER
 
        Default: 1
 
+tcp_rto_min_us - INTEGER
+       Minimal TCP retransmission timeout (in microseconds). Note that the
+       rto_min route option has the highest precedence for configuring this
+       setting, followed by the TCP_BPF_RTO_MIN socket option, followed by
+       this tcp_rto_min_us sysctl.
+
+       The recommended practice is to use a value less or equal to 200000
+       microseconds.
+
+       Possible Values: 1 - INT_MAX
+
+       Default: 200000
+
 UDP variables
 =============
 
index c356c458b3409f966c3c2a1feddc0fa26b5f7088..a91bb971f9015d25151523eb53b205edbd65f003 100644 (file)
@@ -170,6 +170,7 @@ struct netns_ipv4 {
        u8 sysctl_tcp_sack;
        u8 sysctl_tcp_window_scaling;
        u8 sysctl_tcp_timestamps;
+       int sysctl_tcp_rto_min_us;
        u8 sysctl_tcp_recovery;
        u8 sysctl_tcp_thin_linear_timeouts;
        u8 sysctl_tcp_slow_start_after_idle;
index d7892f34a15bed52e52a1e57494b53d34afe1881..bb64c0ef092dbf839eba2d9c2d21a8e57b8e7b6d 100644 (file)
@@ -1503,6 +1503,14 @@ static struct ctl_table ipv4_net_table[] = {
                .proc_handler   = proc_dou8vec_minmax,
                .extra1         = SYSCTL_ONE,
        },
+       {
+               .procname       = "tcp_rto_min_us",
+               .data           = &init_net.ipv4.sysctl_tcp_rto_min_us,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_minmax,
+               .extra1         = SYSCTL_ONE,
+       },
 };
 
 static __net_init int ipv4_sysctl_init_net(struct net *net)
index 5fa68e7f6ddbfd325523365cb41de07d5b938e47..fa43aaacd92bcf78ab542d0d5f267b4cbdfacf26 100644 (file)
@@ -420,6 +420,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;
 
        tp->out_of_order_queue = RB_ROOT;
        sk->tcp_rtx_queue = RB_ROOT;
@@ -428,7 +429,8 @@ void tcp_init_sock(struct sock *sk)
        INIT_LIST_HEAD(&tp->tsorted_sent_queue);
 
        icsk->icsk_rto = TCP_TIMEOUT_INIT;
-       icsk->icsk_rto_min = TCP_RTO_MIN;
+       rto_min_us = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rto_min_us);
+       icsk->icsk_rto_min = usecs_to_jiffies(rto_min_us);
        icsk->icsk_delack_max = TCP_DELACK_MAX;
        tp->mdev_us = jiffies_to_usecs(TCP_TIMEOUT_INIT);
        minmax_reset(&tp->rtt_min, tcp_jiffies32, ~0U);
index 3ef4b274c24b8dca950a50eaf2efb800898dad3e..3613e08ca79496746f99fd65706e6ea4ea26b0e3 100644 (file)
@@ -3502,6 +3502,7 @@ static int __net_init tcp_sk_init(struct net *net)
        net->ipv4.sysctl_tcp_shrink_window = 0;
 
        net->ipv4.sysctl_tcp_pingpong_thresh = 1;
+       net->ipv4.sysctl_tcp_rto_min_us = jiffies_to_usecs(TCP_RTO_MIN);
 
        return 0;
 }