Re: [PATCH RFC nf-next 00/12] netfilter: ipset: convert to rhashtable

Jozsef Kadlecsik <[email protected]> Tue, 14 Jul 2026 17:52:20 +0200 (CEST)
Newsgroups gmane.comp.security.firewalls.netfilter.devel
Message-ID <[email protected]>
Hi Florian,

Thank you your hard work on converting from hash-array to rhashtable! In 
the next days I'll go through the whole patchset.

Best regards,
Jozsef

On Tue, 14 Jul 2026, Florian Westphal wrote:

> Hi,
>
> This is an initial RFC patchset to convert the hash types to rhashtable.
> Main conversion is in patch 8.  First patches contain small drive-by
> fixes, patches after 8 contain further simplifications/cleanups.
> Last patch adds back the FORCEADD support dropped in the conversion
> commit (diff was getting too large...).
>
> The next step is to go through the ipset test failures and figure out
> which ones hint at actual bugs and which ones are just harmless cosmetic
> issues (that could be suppressed by tinkering with diff.sh in ipset tests).
>
> Notable likely valid remaining bugs:
> - iphash: IP: Compare sorted save and restore: [..] FAILED
> - hash:net,iface.t: Check 10.0.1.1 with eth0:
> Failed test: ../src/ipset [..] 10.0.1.1,eth0
> Warning: 10.0.1.1,eth0 is in set test.
>
> I'd like to eventually get rid of more set->lock places, remove all
> usage of rcu_dereference_protected(.. , 1), but thats not too urgent
> atm.
>
> 1) Rework ipset CIDR bookkeeping.  I had to remove this one from the last
> nf batch at the last minute because of a buildbot report. See next patch.
>
> 2) Fix a few nits in patch 1), to be squash-merged.
>
> 3) Add small wrappers for hash and bucket sizes to reduce noise in the
> actual conversion patch.
>
> 4) add and use tmtype_del_cidr_all helper to simplify the upcoming
> rewrite.
>
> 5) Use ip_set_init_comment_slow to prevent race conditions in hash ipset
> types. Add lockdep annotations.
>
> 6) Same as 5, but for remove: adds ip_set_ext_destroy_slow.
>
> 7) Add rhashtable boilerplate stubs to ipset. Initialize and destroy the
> rhashtable without ever adding elements.
>
> 8) Replace ipset's internal hash table with rhashtable.  FORCEADD is
> removed here, and added back in last patch.
>
> 9) Use plain rcu_read_lock, not _bh variants.
>
> 10) Better lockdep annotations in ipset_dereference. Add assertions to
> more places.
>
> 11) Remove the last region lock usage in ipset. Move lock responsibility to
> kadt, uadt, and flush callbacks.
>
> 12) Re-add forceadd support for rhashtable in ipset. Implement
> mtype_remove_random() to evict elements when the set is full.
>
> Florian Westphal (11):
>  netfilter: ipset: rework cidr bookkeeping fixups
>  netfilter: ipset: add small wrappers for hash and bucket sizes
>  netfilter: ipset: add and use mtype_del_cidr_all helper
>  netfilter: ipset: add and use ip_set_init_comment_slow
>  netfilter: ipset: add and use ip_set_ext_destroy_slow
>  netfilter: ipset: add rhashtable boilerplate stubs
>  netfilter: ipset: replace internal hash table with rhashtable
>  netfilter: ipset: use plain rcu_read_lock
>  netfilter: ipset: use correct lockdep annotation in ipset_dereference
>  netfilter: ipset: remove last region lock usage
>  netfilter: ipset: re-add forceadd support for rhashtable
>
> Jozsef Kadlecsik (1):
>  netfilter: ipset: rework cidr bookkeeping
>
> include/linux/netfilter/ipset/ip_set.h       |   44 +-
> net/netfilter/ipset/ip_set_bitmap_gen.h      |    6 +
> net/netfilter/ipset/ip_set_bitmap_ip.c       |   11 +-
> net/netfilter/ipset/ip_set_bitmap_ipmac.c    |    9 +-
> net/netfilter/ipset/ip_set_bitmap_port.c     |   11 +-
> net/netfilter/ipset/ip_set_core.c            |   35 +-
> net/netfilter/ipset/ip_set_hash_gen.h        | 1552 ++++++------------
> net/netfilter/ipset/ip_set_hash_ipportnet.c  |    4 +-
> net/netfilter/ipset/ip_set_hash_net.c        |    4 +-
> net/netfilter/ipset/ip_set_hash_netiface.c   |    4 +-
> net/netfilter/ipset/ip_set_hash_netnet.c     |   12 +-
> net/netfilter/ipset/ip_set_hash_netport.c    |    4 +-
> net/netfilter/ipset/ip_set_hash_netportnet.c |   12 +-
> net/netfilter/ipset/ip_set_list_set.c        |   13 +
> 14 files changed, 629 insertions(+), 1092 deletions(-)
>
> -- 
> 2.54.0
>