tcp: add hrtimer slack to sack compression
authorEric Dumazet <edumazet@google.com>
Thu, 30 Apr 2020 17:35:43 +0000 (10:35 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Apr 2020 20:24:01 +0000 (13:24 -0700)
Add a sysctl to control hrtimer slack, default of 100 usec.

This gives the opportunity to reduce system overhead,
and help very short RTT flows.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
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_input.c
net/ipv4/tcp_ipv4.c

index 3266aee..50b440d 100644 (file)
@@ -651,6 +651,14 @@ tcp_comp_sack_delay_ns - LONG INTEGER
 
        Default : 1,000,000 ns (1 ms)
 
+tcp_comp_sack_slack_ns - LONG INTEGER
+       This sysctl control the slack used when arming the
+       timer used by SACK compression. This gives extra time
+       for small RTT flows, and reduces system overhead by allowing
+       opportunistic reduction of timer interrupts.
+
+       Default : 100,000 ns (100 us)
+
 tcp_comp_sack_nr - INTEGER
        Max number of SACK that can be compressed.
        Using 0 disables SACK compression.
index 5acdb4d..9e36738 100644 (file)
@@ -173,6 +173,7 @@ struct netns_ipv4 {
        int sysctl_tcp_rmem[3];
        int sysctl_tcp_comp_sack_nr;
        unsigned long sysctl_tcp_comp_sack_delay_ns;
+       unsigned long sysctl_tcp_comp_sack_slack_ns;
        struct inet_timewait_death_row tcp_death_row;
        int sysctl_max_syn_backlog;
        int sysctl_tcp_fastopen;
index 95ad71e..3a62842 100644 (file)
@@ -1330,6 +1330,13 @@ static struct ctl_table ipv4_net_table[] = {
                .proc_handler   = proc_doulongvec_minmax,
        },
        {
+               .procname       = "tcp_comp_sack_slack_ns",
+               .data           = &init_net.ipv4.sysctl_tcp_comp_sack_slack_ns,
+               .maxlen         = sizeof(unsigned long),
+               .mode           = 0644,
+               .proc_handler   = proc_doulongvec_minmax,
+       },
+       {
                .procname       = "tcp_comp_sack_nr",
                .data           = &init_net.ipv4.sysctl_tcp_comp_sack_nr,
                .maxlen         = sizeof(int),
index ef921ec..d68128a 100644 (file)
@@ -5324,8 +5324,9 @@ send_now:
        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),
-                     HRTIMER_MODE_REL_PINNED_SOFT);
+       hrtimer_start_range_ns(&tp->compressed_ack_timer, ns_to_ktime(delay),
+                              sock_net(sk)->ipv4.sysctl_tcp_comp_sack_slack_ns,
+                              HRTIMER_MODE_REL_PINNED_SOFT);
 }
 
 static inline void tcp_ack_snd_check(struct sock *sk)
index 83a5d24..6c05f1c 100644 (file)
@@ -2780,6 +2780,7 @@ static int __net_init tcp_sk_init(struct net *net)
                       sizeof(init_net.ipv4.sysctl_tcp_wmem));
        }
        net->ipv4.sysctl_tcp_comp_sack_delay_ns = NSEC_PER_MSEC;
+       net->ipv4.sysctl_tcp_comp_sack_slack_ns = 100 * NSEC_PER_USEC;
        net->ipv4.sysctl_tcp_comp_sack_nr = 44;
        net->ipv4.sysctl_tcp_fastopen = TFO_CLIENT_ENABLE;
        spin_lock_init(&net->ipv4.tcp_fastopen_ctx_lock);