Stewart Smith
d87d67c8bd
tcp: Reduce chance of collisions in inet6_hashfn().
...
[ Upstream commit d11b0df7ddf1831f3e170972f43186dad520bfcc ]
For both IPv4 and IPv6 incoming TCP connections are tracked in a hash
table with a hash over the source & destination addresses and ports.
However, the IPv6 hash is insufficient and can lead to a high rate of
collisions.
The IPv6 hash used an XOR to fit everything into the 96 bits for the
fast jenkins hash, meaning it is possible for an external entity to
ensure the hash collides, thus falling back to a linear search in the
bucket, which is slow.
We take the approach of hash the full length of IPv6 address in
__ipv6_addr_jhash() so that all users can benefit from a more secure
version.
While this may look like it adds overhead, the reality of modern CPUs
means that this is unmeasurable in real world scenarios.
In simulating with llvm-mca, the increase in cycles for the hashing
code was ~16 cycles on Skylake (from a base of ~155), and an extra ~9
on Nehalem (base of ~173).
In commit dd6d2910c5e0 ("netfilter: conntrack: switch to siphash")
netfilter switched from a jenkins hash to a siphash, but even the faster
hsiphash is a more significant overhead (~20-30%) in some preliminary
testing. So, in this patch, we keep to the more conservative approach to
ensure we don't add much overhead per SYN.
In testing, this results in a consistently even spread across the
connection buckets. In both testing and real-world scenarios, we have
not found any measurable performance impact.
Fixes: 08dcdbf6a7 ("ipv6: use a stronger hash for tcp")
Signed-off-by: Stewart Smith <trawets@amazon.com>
Signed-off-by: Samuel Mendoza-Jonas <samjonas@amazon.com>
Suggested-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20230721222410.17914-1-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-08-11 11:53:47 +02:00
..
9p
bluetooth
Bluetooth: L2CAP: Fix use-after-free caused by l2cap_chan_put
2022-08-03 11:59:37 +02:00
caif
net: caif: add proper error handling
2021-06-10 13:37:09 +02:00
iucv
netfilter
netfilter: nf_tables: reject unbound anonymous set before commit phase
2023-07-27 08:37:28 +02:00
netns
netfilter: nf_tables: use net_generic infra for transaction data
2023-07-27 08:37:27 +02:00
nfc
nfc: constify several pointers to u8, char and sk_buff
2023-07-27 08:37:07 +02:00
phonet
sctp
sctp: add a refcnt in sctp_stream_priorities to avoid a nested loop
2023-03-11 16:44:11 +01:00
tc_act
net/sched: act_pedit: really ensure the skb is writable
2022-05-18 09:47:25 +02:00
6lowpan.h
act_api.h
net: sched: fix police ext initialization
2021-03-04 10:26:53 +01:00
addrconf.h
ipv6/addrconf: fix a null-ptr-deref bug for ip6_ptr
2022-08-03 11:59:39 +02:00
af_ieee802154.h
af_rxrpc.h
af_unix.h
af_vsock.h
ah.h
arp.h
ipv4: Invalidate neighbour for broadcast address upon address addition
2022-04-15 14:18:33 +02:00
atmclip.h
ax25.h
ax25: fix reference count leaks of ax25_dev
2022-04-20 09:19:39 +02:00
ax88796.h
bond_3ad.h
bonding: fix data-races around agg_select_timer
2022-02-23 11:59:58 +01:00
bond_alb.h
bonding (gcc13): synchronize bond_{a,t}lb_xmit() types
2023-06-14 10:59:58 +02:00
bond_options.h
bonding.h
net: fix stack overflow when LRO is disabled for virtual interfaces
2023-05-30 12:44:09 +01:00
bpf_sk_storage.h
busy_poll.h
net: Fix a data-race around sysctl_net_busy_poll.
2022-09-05 10:27:42 +02:00
calipso.h
cfg80211-wext.h
cfg80211.h
mac80211: properly handle A-MSDUs that start with an RFC 1042 header
2021-06-03 08:59:01 +02:00
cfg802154.h
checksum.h
net: Force inlining of checksum functions in net/checksum.h
2022-03-02 11:41:08 +01:00
cipso_ipv4.h
cls_cgroup.h
codel.h
codel_impl.h
codel_qdisc.h
compat.h
datalink.h
dcbevent.h
dcbnl.h
devlink.h
drop_monitor.h
dsa.h
dsfield.h
dst.h
net: Remove unused inline function dst_hold_and_use()
2023-06-21 15:44:12 +02:00
dst_cache.h
dst_metadata.h
net: fix a memleak when uncloning an skb dst and its metadata
2022-02-16 12:52:51 +01:00
dst_ops.h
erspan.h
esp.h
esp: limit skb_page_frag_refill use to a single page
2022-07-12 16:30:45 +02:00
ethoc.h
failover.h
fib_notifier.h
fib_rules.h
ipv6: fix memory leak in fib6_rule_suppress
2021-12-08 09:01:13 +01:00
firewire.h
flow.h
flow_dissector.h
net/sched: flower: fix parsing of ethertype following VLAN header
2022-04-20 09:19:34 +02:00
flow_offload.h
fou.h
fq.h
fq_impl.h
garp.h
gen_stats.h
genetlink.h
geneve.h
gre.h
gro_cells.h
gtp.h
gue.h
hwbm.h
icmp.h
net: icmp: pass zeroed opts from icmp{,v6}_ndo_send before sending
2021-03-04 10:26:53 +01:00
ieee80211_radiotap.h
ieee802154_netdev.h
net: ieee802154: return -EINVAL for unknown addr type
2022-10-26 13:22:59 +02:00
if_inet6.h
ipv6: fix locking issues with loops over idev->addr_list
2022-06-14 18:11:25 +02:00
ife.h
ila.h
inet6_connection_sock.h
inet6_hashtables.h
inet_common.h
inet_connection_sock.h
tcp: relookup sock for RST+ACK packets handled by obsolete req sock
2021-03-30 14:35:26 +02:00
inet_ecn.h
inet_ecn: Fix endianness of checksum update when setting ECT(1)
2020-12-08 10:40:25 +01:00
inet_frag.h
inet: frags: annotate races around fqdir->dead and fqdir->high_thresh
2022-01-27 09:19:54 +01:00
inet_hashtables.h
secure_seq: use the 64 bits of the siphash for port offset calculation
2022-06-06 08:33:49 +02:00
inet_sock.h
tcp/dccp: Fix a data-race around sysctl_tcp_fwmark_accept.
2022-07-29 17:14:11 +02:00
inet_timewait_sock.h
inetpeer.h
ip.h
ipv{4,6}/raw: fix output xfrm lookup wrt protocol
2023-06-05 08:17:33 +02:00
ip6_checksum.h
ip6_fib.h
ipv6: annotate accesses to fn->fn_sernum
2022-02-01 17:24:38 +01:00
ip6_route.h
net: ipv6: fix returned variable type in ip6_skb_dst_mtu
2021-08-12 13:20:57 +02:00
ip6_tunnel.h
ip_gre, ip6_gre: Fix race condition on o_seqno in collect_md mode
2023-05-30 12:44:05 +01:00
ip_fib.h
ipv4: convert fib_num_tclassid_users to atomic_t
2021-12-08 09:01:12 +01:00
ip_tunnels.h
ip_tunnels: allow VXLAN/GENEVE to inherit TOS/TTL from VLAN
2023-06-28 10:18:37 +02:00
ip_vs.h
ipcomp.h
ipconfig.h
ipv6.h
tcp: Reduce chance of collisions in inet6_hashfn().
2023-08-11 11:53:47 +02:00
ipv6_frag.h
inet: frags: annotate races around fqdir->dead and fqdir->high_thresh
2022-01-27 09:19:54 +01:00
ipv6_stubs.h
net: ipv6: add fib6_nh_release_dsts stub
2021-12-01 09:23:33 +01:00
ipx.h
iw_handler.h
kcm.h
l3mdev.h
lag.h
lapb.h
lib80211.h
llc.h
llc: fix out-of-bound array index in llc_sk_dev_hash()
2021-11-17 09:48:47 +01:00
llc_c_ac.h
llc_c_ev.h
llc_c_st.h
llc_conn.h
llc_if.h
llc_pdu.h
net: llc: fix skb_over_panic
2021-08-04 12:27:39 +02:00
llc_s_ac.h
llc_s_ev.h
llc_s_st.h
llc_sap.h
lwtunnel.h
mac80211.h
mac802154.h
mip6.h
mld.h
mpls.h
mpls_iptunnel.h
mrp.h
mrp: introduce active flags to prevent UAF when applicant uninit
2023-01-18 11:41:37 +01:00
ncsi.h
ndisc.h
neighbour.h
neighbour: delete neigh_lookup_nodev as not used
2023-06-21 15:44:12 +02:00
net_failover.h
net_namespace.h
net: make get_net_ns return error if NET_NS is disabled
2021-06-23 14:41:25 +02:00
net_ratelimit.h
netevent.h
netlabel.h
netlink.h
netprio_cgroup.h
netrom.h
nexthop.h
net: ipv4: Fix rtnexthop len when RTA_FLOW is present
2021-10-06 15:42:33 +02:00
nl802154.h
net: ieee802154: handle iftypes as u32
2021-12-01 09:23:32 +01:00
nsh.h
p8022.h
page_pool.h
mm: fix struct page layout on 32-bit systems
2021-05-19 10:08:31 +02:00
ping.h
pkt_cls.h
pkt_sched.h
net/sched: make psched_mtu() RTNL-less safe
2023-07-27 08:37:33 +02:00
pptp.h
protocol.h
tcp/udp: Make early_demux back namespacified.
2022-11-10 17:57:55 +01:00
psample.h
psample: Add a fwd declaration for skbuff
2021-08-18 08:56:59 +02:00
psnap.h
raw.h
raw: Fix a data-race around sysctl_raw_l3mdev_accept.
2022-07-21 20:59:22 +02:00
rawv6.h
red.h
sch_red: fix off-by-one checks in red_check_params()
2021-04-14 08:24:14 +02:00
regulatory.h
request_sock.h
rose.h
route.h
ipv4: remove sparse error in ip_neigh_gw4()
2022-02-01 17:24:39 +01:00
rsi_91x.h
rtnetlink.h
can: dev: Move device back to init netns on owning netns delete
2021-03-30 14:35:29 +02:00
rtnh.h
sch_generic.h
net/sched: sch_taprio: fix possible use-after-free
2023-02-06 07:52:37 +01:00
scm.h
scm: fix MSG_CTRUNC setting condition for SO_PASSSEC
2023-05-17 11:35:41 +02:00
secure_seq.h
secure_seq: use the 64 bits of the siphash for port offset calculation
2022-06-06 08:33:49 +02:00
seg6.h
seg6_hmac.h
seg6_local.h
slhc_vj.h
smc.h
snmp.h
sock.h
netlink: Add __sock_i_ino() for __netlink_diag_dump().
2023-07-27 08:37:12 +02:00
sock_reuseport.h
Space.h
stp.h
strparser.h
bpf: sockmap, strparser, and tls are reusing qdisc_skb_cb and colliding
2021-11-17 09:48:48 +01:00
switchdev.h
tcp.h
tcp: annotate data-races around tp->notsent_lowat
2023-07-27 08:37:45 +02:00
tcp_states.h
timewait_sock.h
tipc.h
tls.h
net/tls: Fix flipped sign in tls_err_abort() calls
2021-11-02 19:46:12 +01:00
transp_v6.h
tso.h
tun_proto.h
udp.h
tcp/udp: Call inet6_destroy_sock() in IPv6 sk->sk_destruct().
2023-04-26 11:24:05 +02:00
udp_tunnel.h
udp: call udp_encap_enable for v6 sockets when enabling encap
2022-04-15 14:18:01 +02:00
udplite.h
tcp/udp: Call inet6_destroy_sock() in IPv6 sk->sk_destruct().
2023-04-26 11:24:05 +02:00
vsock_addr.h
vxlan.h
vxlan: calculate correct header length for GPE
2023-08-11 11:53:47 +02:00
wext.h
wimax.h
x25.h
x25device.h
xdp.h
xdp_priv.h
xdp_sock.h
xfrm.h
xfrm: Check if_id in xfrm_migrate
2022-03-19 13:40:16 +01:00