Skip to content

Lockless netlink_lookup() with new concurrent hash table

Thomas Graf lkml netdev netfilter-devel 5 versions – Applied

Status from this message: Applied, thanks Thomas.

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v5 Latest3 patches 8 repliesApplied
  2. v43 patches 8 repliesSuperseded
  3. v33 patches 7 repliesSuperseded
Earlier versions · 2
VersionPostedPatchesRepliesStatus
v23 patches3 repliesSuperseded
v12 patches5 repliesSuperseded

Changes from the cover letter · 18 lines

v4-v5:
- use GFP_KERNEL to alloc Netlink buckets as suggested by Nikolay Aleksandrov
- free nft hash element on removal as spotted by Nikolay Aleksandrov and Patrick McHardy
v3-v4:
- fixed wrong shift assignment placement as spotted by Nikolay Aleksandrov
- reverted default size of nft_hash to 4 as requested by Patrick McHardy, default size for other hash tables remains at 64 if no hint is given
- fixed copyright as requested by Patrick McHardy
v2-v3:
- fixed typo in nft_hash_destroy() when passing rhashtable handle
v1-v2:
- fixed traversal off-by-one as spotted by Tobias Klauser
- removed unlikely() from BUG_ON() as spotted by Josh Triplett
- new 3rd patch to convert nft_hash to rhashtable
- make rhashtable_insert() return void
- nl_sk_hash_lock must be a mutex
- fixed wrong name of rht_shrink_below_30()
- exported symbols rht_grow_above_75() and rht_shrink_below_30()
- allow table freeing with RCU callback

Patches in v5 Applied

#Subject and filesSizeRepliesApplied
1/3lib: Resizable, Scalable, Concurrent Hash Tableinclude/linux/rhashtable.h lib/Kconfig.debug lib/Makefile +1 more+1019 -11 reply
2/3netlink: Convert netlink_lookup() to use RCU protected hash tablenet/netlink/af_netlink.c net/netlink/af_netlink.h net/netlink/diag.c+119 -1955 replies
3/3nftables: Convert nft_hash to use generic rhashtablenet/netfilter/nft_hash.c+55 -2361 reply

Reviews trailers per patch

All 3 patches have a Reviewed-by or Acked-by.

PatchPatrick McHardyNikolay Aleksandrov
1/3R-b
2/3R-b
3/3A-b R-b

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v5 thread

Cover letter [PATCH net-next v5 0/3] Lockless netlink_lookup() with new concurrent hash table

Netlink sockets are maintained in a hash table to allow efficient lookup via the port ID for unicast messages. However, lookups currently require a read lock to be taken. This series adds a new generic, resizable, scalable, concurrent hash table based on the paper referenced in the first patch. It then makes use of the new data type to implement lockless netlink_lookup().

Patch 3/3 to convert nft_hash is included for reference but should be merged via the netfilter tree. Inclusion in this series is to provide context for the suggested API.

Against net-next since the initial user of the new hash table is in net/

Changes:
v4-v5:
- use GFP_KERNEL to alloc Netlink buckets as suggested by Nikolay Aleksandrov
- free nft hash element on removal as spotted by Nikolay Aleksandrov and Patrick McHardy
v3-v4:
- fixed wrong shift assignment placement as spotted by Nikolay Aleksandrov
- reverted default size of nft_hash to 4 as requested by Patrick McHardy, default size for other hash tables remains at 64 if no hint is given
- fixed copyright as requested by Patrick McHardy
v2-v3:
- fixed typo in nft_hash_destroy() when passing rhashtable handle
v1-v2:
- fixed traversal off-by-one as spotted by Tobias Klauser
- removed unlikely() from BUG_ON() as spotted by Josh Triplett
- new 3rd patch to convert nft_hash to rhashtable
- make rhashtable_insert() return void
- nl_sk_hash_lock must be a mutex
- fixed wrong name of rht_shrink_below_30()
- exported symbols rht_grow_above_75() and rht_shrink_below_30()
- allow table freeing with RCU callback

Thomas Graf (3):
lib: Resizable, Scalable, Concurrent Hash Table
netlink: Convert netlink_lookup() to use RCU protected hash table
nftables: Convert nft_hash to use generic rhashtable

 include/linux/rhashtable.h | 213 ++++++++++++
 lib/Kconfig.debug          |   8 +
 lib/Makefile               |   2 +-
 lib/rhashtable.c           | 797 +++++++++++++++++++++++++++++++++++++++++++++
 net/netfilter/nft_hash.c   | 291 ++++-------------
 net/netlink/af_netlink.c   | 285 ++++++----------
 net/netlink/af_netlink.h   |  18 +-
 net/netlink/diag.c         |  11 +-
 8 files changed, 1193 insertions(+), 432 deletions(-)
 create mode 100644 include/linux/rhashtable.h
 create mode 100644 lib/rhashtable.c
Signature · 1 line
1.9.3