Merge branch 'add-a-bhash2-table-hashed-by-port-address'
authorJakub Kicinski <kuba@kernel.org>
Sat, 21 May 2022 01:16:31 +0000 (18:16 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 21 May 2022 01:16:31 +0000 (18:16 -0700)
commitaa5334b1f96801cd09775217a72ff252ef614d7a
tree464be1977af3e8290dd0f519c5c3849299b20c3a
parenteac67d83bf2553f98cfddd42cfbcfd6f9ccfc287
parent538aaf9b2383701094a47797b4554c6a21c83eed
Merge branch 'add-a-bhash2-table-hashed-by-port-address'

Joanne Koong says:

====================
Add a bhash2 table hashed by port + address

This patchset proposes adding a bhash2 table that hashes by port and address.
The motivation behind bhash2 is to expedite bind requests in situations where
the port has many sockets in its bhash table entry, which makes checking bind
conflicts costly especially given that we acquire the table entry spinlock
while doing so, which can cause softirq cpu lockups and can prevent new tcp
connections.

We ran into this problem at Meta where the traffic team binds a large number
of IPs to port 443 and the bind() call took a significant amount of time
which led to cpu softirq lockups, which caused packet drops and other failures
on the machine

The patches are as follows:
1/2 - Adds a second bhash table (bhash2) hashed by port and address
2/2 - Adds a test for timing how long an additional bind request takes when
the bhash entry is populated

When experimentally testing this on a local server for ~24k sockets bound to
the port, the results seen were:

ipv4:
before - 0.002317 seconds
with bhash2 - 0.000018 seconds

ipv6:
before - 0.002431 seconds
with bhash2 - 0.000021 seconds
====================

Link: https://lore.kernel.org/r/20220520001834.2247810-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>