WSL2-Linux-Kernel/net/ipv6
Eric Dumazet f35f821935 tcp: defer skb freeing after socket lock is released
tcp recvmsg() (or rx zerocopy) spends a fair amount of time
freeing skbs after their payload has been consumed.

A typical ~64KB GRO packet has to release ~45 page
references, eventually going to page allocator
for each of them.

Currently, this freeing is performed while socket lock
is held, meaning that there is a high chance that
BH handler has to queue incoming packets to tcp socket backlog.

This can cause additional latencies, because the user
thread has to process the backlog at release_sock() time,
and while doing so, additional frames can be added
by BH handler.

This patch adds logic to defer these frees after socket
lock is released, or directly from BH handler if possible.

Being able to free these skbs from BH handler helps a lot,
because this avoids the usual alloc/free assymetry,
when BH handler and user thread do not run on same cpu or
NUMA node.

One cpu can now be fully utilized for the kernel->user copy,
and another cpu is handling BH processing and skb/page
allocs/frees (assuming RFS is not forcing use of a single CPU)

Tested:
 100Gbit NIC
 Max throughput for one TCP_STREAM flow, over 10 runs

MTU : 1500
Before: 55 Gbit
After:  66 Gbit

MTU : 4096+(headers)
Before: 82 Gbit
After:  95 Gbit

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-11-16 13:10:35 +00:00
..
ila net: ipv6: check return value of rhashtable_init 2021-09-28 12:59:24 +01:00
netfilter Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-10-22 11:41:16 +01:00
Kconfig ipv6: ioam: Add support for the ip6ip6 encapsulation 2021-10-04 12:53:35 +01:00
Makefile net: ipv6: use ipv6-y directly instead of ipv6-objs 2021-09-28 13:13:40 +01:00
addrconf.c net: ndisc: introduce ndisc_evict_nocarrier sysctl parameter 2021-11-01 19:57:14 -07:00
addrconf_core.c
addrlabel.c
af_inet6.c inet: remove races in inet{6}_getname() 2021-10-27 18:20:21 -07:00
ah6.c
anycast.c
calipso.c
datagram.c
esp6.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-06-29 15:45:27 -07:00
esp6_offload.c
exthdrs.c ipv6: Remove duplicate statements 2021-11-14 12:20:44 +00:00
exthdrs_core.c
exthdrs_offload.c
fib6_notifier.c
fib6_rules.c
fou6.c
icmp.c ipv6: ICMPV6: add response to ICMPV6 RFC 8335 PROBE messages 2021-06-28 14:29:45 -07:00
inet6_connection_sock.c
inet6_hashtables.c bpf: Add ingress_ifindex to bpf_sk_lookup 2021-11-10 16:29:58 -08:00
ioam6.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-10-14 16:50:14 -07:00
ioam6_iptunnel.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-10-14 16:50:14 -07:00
ip6_checksum.c
ip6_fib.c ipv6: delay fib6_sernum increase in fib6_add 2021-09-13 13:00:53 +01:00
ip6_flowlabel.c
ip6_gre.c ip: use dev_addr_set() in tunnels 2021-10-13 09:41:37 -07:00
ip6_icmp.c
ip6_input.c
ip6_offload.c
ip6_offload.h
ip6_output.c net: remove sk_route_nocaps 2021-11-16 13:10:34 +00:00
ip6_tunnel.c ip: use dev_addr_set() in tunnels 2021-10-13 09:41:37 -07:00
ip6_udp_tunnel.c
ip6_vti.c ip: use dev_addr_set() in tunnels 2021-10-13 09:41:37 -07:00
ip6mr.c net: Remove redundant if statements 2021-08-05 13:27:50 +01:00
ipcomp6.c
ipv6_sockglue.c ipv6: guard IPV6_MINHOPCOUNT with a static key 2021-10-25 18:02:13 -07:00
mcast.c ipv6: change return type from int to void for mld_process_v2 2021-09-02 11:29:55 +01:00
mcast_snoop.c
mip6.c
ndisc.c net: ndisc: introduce ndisc_evict_nocarrier sysctl parameter 2021-11-01 19:57:14 -07:00
netfilter.c
output_core.c
ping.c
proc.c
protocol.c
raw.c net: sock: introduce sk_error_report 2021-06-29 11:28:21 -07:00
reassembly.c
route.c ipv6: enable net.ipv6.route.max_size sysctl in network namespace 2021-10-28 12:53:39 +01:00
rpl.c
rpl_iptunnel.c
seg6.c net:ipv6:Remove unneeded semicolon 2021-11-03 11:18:46 +00:00
seg6_hmac.c net: ipv6: check return value of rhashtable_init 2021-09-28 12:59:24 +01:00
seg6_iptunnel.c seg6_iptunnel: Remove redundant initialization of variable err 2021-09-03 12:32:25 +01:00
seg6_local.c ipv6: seg6: remove duplicated include 2021-08-31 12:41:47 +01:00
sit.c ip: use dev_addr_set() in tunnels 2021-10-13 09:41:37 -07:00
syncookies.c
sysctl_net_ipv6.c ipv6: ioam: Data plane support for Pre-allocated Trace 2021-07-21 08:14:33 -07:00
tcp_ipv6.c tcp: defer skb freeing after socket lock is released 2021-11-16 13:10:35 +00:00
tcpv6_offload.c
tunnel6.c
udp.c Merge https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next 2021-11-15 08:49:23 -08:00
udp_impl.h
udp_offload.c
udplite.c
xfrm6_input.c
xfrm6_output.c net: ipv6: fix return value of ip6_skb_dst_mtu 2021-07-02 11:57:01 -07:00
xfrm6_policy.c
xfrm6_protocol.c
xfrm6_state.c
xfrm6_tunnel.c