aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_output.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2017-11-11 18:54:12 -0500
committerDavid S. Miller <davem@davemloft.net>2017-11-14 02:18:36 -0500
commit3a9b76fd0db9f0d426533f96a68a62a58753a51e (patch)
treea294317a5c3f2d9f3144d9d5bf9e58f9f3d61c8f /net/ipv4/tcp_output.c
parent166c88189632b6b13612dc15e031f58d199602da (diff)
tcp: allow drivers to tweak TSQ logic
I had many reports that TSQ logic breaks wifi aggregation. Current logic is to allow up to 1 ms of bytes to be queued into qdisc and drivers queues. But Wifi aggregation needs a bigger budget to allow bigger rates to be discovered by various TCP Congestion Controls algorithms. This patch adds an extra socket field, allowing wifi drivers to select another log scale to derive TCP Small Queue credit from current pacing rate. Initial value is 10, meaning that this patch does not change current behavior. We expect wifi drivers to set this field to smaller values (tests have been done with values from 6 to 9) They would have to use following template : if (skb->sk && skb->sk->sk_pacing_shift != MY_PACING_SHIFT) skb->sk->sk_pacing_shift = MY_PACING_SHIFT; Ref: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1670041 Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Johannes Berg <johannes.berg@intel.com> Cc: Toke Høiland-Jørgensen <toke@toke.dk> Cc: Kir Kolyshkin <kir@openvz.org> Acked-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r--net/ipv4/tcp_output.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 0256f7a41041..76dbe884f246 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1720,7 +1720,7 @@ u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now,
1720{ 1720{
1721 u32 bytes, segs; 1721 u32 bytes, segs;
1722 1722
1723 bytes = min(sk->sk_pacing_rate >> 10, 1723 bytes = min(sk->sk_pacing_rate >> sk->sk_pacing_shift,
1724 sk->sk_gso_max_size - 1 - MAX_TCP_HEADER); 1724 sk->sk_gso_max_size - 1 - MAX_TCP_HEADER);
1725 1725
1726 /* Goal is to send at least one packet per ms, 1726 /* Goal is to send at least one packet per ms,
@@ -2198,7 +2198,7 @@ static bool tcp_small_queue_check(struct sock *sk, const struct sk_buff *skb,
2198{ 2198{
2199 unsigned int limit; 2199 unsigned int limit;
2200 2200
2201 limit = max(2 * skb->truesize, sk->sk_pacing_rate >> 10); 2201 limit = max(2 * skb->truesize, sk->sk_pacing_rate >> sk->sk_pacing_shift);
2202 limit = min_t(u32, limit, 2202 limit = min_t(u32, limit,
2203 sock_net(sk)->ipv4.sysctl_tcp_limit_output_bytes); 2203 sock_net(sk)->ipv4.sysctl_tcp_limit_output_bytes);
2204 limit <<= factor; 2204 limit <<= factor;