tcp: add tcp_comp_sack_delay_ns sysctl
authorEric Dumazet <edumazet@google.com>
Thu, 17 May 2018 21:47:28 +0000 (14:47 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 May 2018 15:40:27 +0000 (11:40 -0400)
This per netns sysctl allows for TCP SACK compression fine-tuning.

Its default value is 1,000,000, or 1 ms to meet TSO autosizing period.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/ip-sysctl.txt
include/net/netns/ipv4.h
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c

index ea304a2..7ba9529 100644 (file)
@@ -525,6 +525,13 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max
 tcp_sack - BOOLEAN
        Enable select acknowledgments (SACKS).
 
+tcp_comp_sack_delay_ns - LONG INTEGER
+       TCP tries to reduce number of SACK sent, using a timer
+       based on 5% of SRTT, capped by this sysctl, in nano seconds.
+       The default is 1ms, based on TSO autosizing period.
+
+       Default : 1,000,000 ns (1 ms)
+
 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
index 8491bc9..9273182 100644 (file)
@@ -160,6 +160,7 @@ struct netns_ipv4 {
        int sysctl_tcp_pacing_ca_ratio;
        int sysctl_tcp_wmem[3];
        int sysctl_tcp_rmem[3];
+       unsigned long sysctl_tcp_comp_sack_delay_ns;
        struct inet_timewait_death_row tcp_death_row;
        int sysctl_max_syn_backlog;
        int sysctl_tcp_fastopen;
index 4b195ba..11fbfdc 100644 (file)
@@ -1151,6 +1151,13 @@ static struct ctl_table ipv4_net_table[] = {
                .proc_handler   = proc_dointvec_minmax,
                .extra1         = &one,
        },
+       {
+               .procname       = "tcp_comp_sack_delay_ns",
+               .data           = &init_net.ipv4.sysctl_tcp_comp_sack_delay_ns,
+               .maxlen         = sizeof(unsigned long),
+               .mode           = 0644,
+               .proc_handler   = proc_doulongvec_minmax,
+       },
        {
                .procname       = "udp_rmem_min",
                .data           = &init_net.ipv4.sysctl_udp_rmem_min,
index cc2ac53..6a1dae3 100644 (file)
@@ -5113,13 +5113,13 @@ send_now:
        if (hrtimer_is_queued(&tp->compressed_ack_timer))
                return;
 
-       /* compress ack timer : 5 % of rtt, but no more than 1 ms */
+       /* compress ack timer : 5 % of rtt, but no more than tcp_comp_sack_delay_ns */
 
        rtt = tp->rcv_rtt_est.rtt_us;
        if (tp->srtt_us && tp->srtt_us < rtt)
                rtt = tp->srtt_us;
 
-       delay = min_t(unsigned long, NSEC_PER_MSEC,
+       delay = min_t(unsigned long, sock_net(sk)->ipv4.sysctl_tcp_comp_sack_delay_ns,
                      rtt * (NSEC_PER_USEC >> 3)/20);
        sock_hold(sk);
        hrtimer_start(&tp->compressed_ack_timer, ns_to_ktime(delay),
index caf23de..a3f4647 100644 (file)
@@ -2572,6 +2572,7 @@ static int __net_init tcp_sk_init(struct net *net)
                       init_net.ipv4.sysctl_tcp_wmem,
                       sizeof(init_net.ipv4.sysctl_tcp_wmem));
        }
+       net->ipv4.sysctl_tcp_comp_sack_delay_ns = NSEC_PER_MSEC;
        net->ipv4.sysctl_tcp_fastopen = TFO_CLIENT_ENABLE;
        spin_lock_init(&net->ipv4.tcp_fastopen_ctx_lock);
        net->ipv4.sysctl_tcp_fastopen_blackhole_timeout = 60 * 60;