From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Florian Westphal <fw@strlen.de>
Cc: netfilter-devel@vger.kernel.org
Subject: Re: [PATCH nf,v2 2/2] netfilter: nf_tables: call set ops .commit when building new ruleset
Date: Wed, 12 Aug 2026 02:30:11 +0200 [thread overview]
Message-ID: <anu-k2MbkI1Hx7zC@chamomile> (raw)
In-Reply-To: <anTMFbo6AB9IqejA@strlen.de>
Hi Florian,
On Thu, Aug 06, 2026 at 08:01:57PM +0200, Florian Westphal wrote:
> Pablo Neira Ayuso <pablo@netfilter.org> wrote:
> > > Why must the blob be rebuilt before stale node purge in rbtree case?
> >
> > ... there is a gap between the ruleset blob is built and published and
> > the set .commit interface is called to publish the new version of the
> > rbtree/pipapo datastructure.
> >
> > See:
> > https://lore.kernel.org/netfilter-devel/589d243b-3d88-4138-9786-1bbb4347e79d@app.fastmail.com/
>
> Ah. That makes sense. So the problem is not rbtree specific. Problem is
> that packets switch over to the *new base chain* (linked to nf machinery,
> nft rule blob becomes reachable on base_seq swap:
>
> 1. commit phase starts.
> 2. seqcount gets bumped.
> A. Packet p1 enters machinery
> 3. elements get purged / chains / tables unlinked, netlink notificatons
> etc. etc.
> B. Packet p1 is in nft_lookup, which gets updated base_seq,
> but no match because rbtree blob resp. pipapo live blob
> are empty in the 'flush ruleset; table t { ..' case.
> 4. nft_set_commit_update() is called.
Yes. The empty set is exposed to the packet path for a short time span,
until nft_set_commit_update() is called.
> If the above is right your patch makes much more sense now :-)
>
> The logic with (set->ops->abort_skip_removal && early_commit)
> however is hard to grasp.
I can add a specific .early_commit in v3 as Fernando suggested.
> Even with NFT_COMMIT_PHASE_EARLY or whatever its bad because
> the set implementation details leak into the transaction phase.
> But I understand that you'd like to at least solve it for rbtree
> with a smaller change, so thats ok.
>
> Is there a long-term plan?
>
> Maybe your 'pre-commit' phase could iterate the transaction
> log and relink transactions (add/del/update of set elements
> ) to the owning set? Contradicting transactions (destroy set x,
> then remove element from x) should have been caught earlier, so
> this delete-from-transaction-log-and-link-to-per-set-struct should
> not be a problem. Perhaps we might see issues with changes in the
> netlink reporting order... but thats hopefully easy to avoid.
>
> the ->commit() callback could then access the pending transactions
> for the set (element adds/deletes) and always get invoked early.
>
> Pipapo could walk its specific elem deletions internally, then swap.
>
> The only other issue I see is that we need a second
> list_for_each_entry_safe(trans, next, &nft_net->commit_list, list)
>
> ... walk, because the step-1 walk is allowed to fail.
I was considering to address this from the pipapo datastructure itself.
The idea would be similar to what the rbtree does, which is to offer a
front-end pipapo datastructure that is exposed to control plane that can
be updated under the commit mutex and that is not exposed to packet
path. Then use it from this new .early_commit interface to clone it,
then publish the new version and release the stale via RCU.
Same approach for the bitmap set.
As for the non-rhashtable version, it could be possible to build a
compact hashtable based on the control plane datastructure, ie.
rhashtable would be only used for control plane and a compact hashtable
(using array for buckets and chains) will be built from the new
.early_commit interface to publish to datapath.
Exception are dynsets, where a single rhashtable can be used, both to
control and datapath.
prev parent reply other threads:[~2026-08-12 0:30 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-05 17:11 [PATCH nf,v2 1/2] netfilter: nf_tables: move set_update_list to nftables per-netns Pablo Neira Ayuso
2026-08-05 17:11 ` [PATCH nf,v2 2/2] netfilter: nf_tables: call set ops .commit when building new ruleset Pablo Neira Ayuso
2026-08-06 10:30 ` Fernando Fernandez Mancera
2026-08-06 14:35 ` Pablo Neira Ayuso
2026-08-10 9:43 ` Fernando Fernandez Mancera
2026-08-06 11:08 ` Florian Westphal
2026-08-06 14:48 ` Pablo Neira Ayuso
2026-08-06 18:01 ` Florian Westphal
2026-08-12 0:30 ` Pablo Neira Ayuso [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=anu-k2MbkI1Hx7zC@chamomile \
--to=pablo@netfilter.org \
--cc=fw@strlen.de \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox