From: Florian Westphal <fw@strlen.de>
To: Pablo Neira Ayuso <pablo@netfilter.org>
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: Thu, 6 Aug 2026 20:01:57 +0200 [thread overview]
Message-ID: <anTMFbo6AB9IqejA@strlen.de> (raw)
In-Reply-To: <anSe0eK9dl1d2J7-@chamomile>
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.
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.
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.
next prev parent reply other threads:[~2026-08-06 18:02 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 [this message]
2026-08-12 0:30 ` Pablo Neira Ayuso
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=anTMFbo6AB9IqejA@strlen.de \
--to=fw@strlen.de \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.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