tcp: get rid of sysctl_tcp_adv_win_scale
authorEric Dumazet <edumazet@google.com>
Mon, 17 Jul 2023 15:29:17 +0000 (15:29 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 19 Jul 2023 01:41:18 +0000 (18:41 -0700)
commitdfa2f0483360d4d6f2324405464c9f281156bd87
tree5aa4cb885109efde347b21e9669be75ff8175bf9
parent63c8778d9149d5df86e3a5dd192103d42d74cc93
tcp: get rid of sysctl_tcp_adv_win_scale

With modern NIC drivers shifting to full page allocations per
received frame, we face the following issue:

TCP has one per-netns sysctl used to tweak how to translate
a memory use into an expected payload (RWIN), in RX path.

tcp_win_from_space() implementation is limited to few cases.

For hosts dealing with various MSS, we either under estimate
or over estimate the RWIN we send to the remote peers.

For instance with the default sysctl_tcp_adv_win_scale value,
we expect to store 50% of payload per allocated chunk of memory.

For the typical use of MTU=1500 traffic, and order-0 pages allocations
by NIC drivers, we are sending too big RWIN, leading to potential
tcp collapse operations, which are extremely expensive and source
of latency spikes.

This patch makes sysctl_tcp_adv_win_scale obsolete, and instead
uses a per socket scaling factor, so that we can precisely
adjust the RWIN based on effective skb->len/skb->truesize ratio.

This patch alone can double TCP receive performance when receivers
are too slow to drain their receive queue, or by allowing
a bigger RWIN when MSS is close to PAGE_SIZE.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Link: https://lore.kernel.org/r/20230717152917.751987-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/networking/ip-sysctl.rst
include/linux/tcp.h
include/net/netns/ipv4.h
include/net/tcp.h
net/ipv4/tcp.c
net/ipv4/tcp_input.c