mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Florian Westphal <fw@strlen.de>
To: Joas Antonio dos Santos <joasantonio108@gmail.com>
Cc: Pablo Neira Ayuso <pablo@netfilter.org>,
	Phil Sutter <phil@nwl.cc>, Weiming Shi <bestswngs@gmail.com>,
	netfilter-devel@vger.kernel.org, coreteam@netfilter.org,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH nf] netfilter: nft_set_pipapo: skip transaction elements during GC
Date: Sun, 25 Oct 2026 06:38:38 +0100	[thread overview]
Message-ID: <at2V3g-B1Ko2x1iK@strlen.de> (raw)
In-Reply-To: <179288180870.24716.7833838593165388250@gmail.com>

Joas Antonio dos Santos <joasantonio108@gmail.com> wrote:
> The catch is that the expiration isn't stamped at activation, it's
> stamped when the element is allocated. nft_set_elem_init() does:
> 
> 	nft_set_ext_timeout(ext)->expiration = get_jiffies_64() + expiration;
> 
> and that happens back in the parse phase (nft_add_set_elem), while we're
> still going through the batch. The element only goes active later, in
> nf_tables_commit(), which is also where the gc tstamp is taken
> (nft_net->tstamp = get_jiffies_64()).


Can you name the line in the source code?
I am not seeing it :-(

> So the expiration is really parse_time + timeout, and the commit-time gc
> scan checks it against commit_time. If you add a big batch of elements
> with a short timeout, they get parsed one by one and the commit only
> happens at the very end, so the ones parsed early in the batch have
> already gone past their timeout by the time we reach the commit tstamp.

Thats not supposed to cause a gc?

All the sync gc functions are supposed to check against the reference
timestamp taken at the beginning of the transaction start, in
nf_tables_valid_genid().

They are NOT supposed to check against wall clock time.
Even if transaction takes 5 minutes: the sync gc step should
NOT observe even a single timed out elemenent.

They become stale only AFTER the sync gc step.

tstamp is coming from nft_nat->tstamp, i.e. start of transaction.
e->ext timestamp therefore should never be in the past compared
to that reference time.

1751                 if (__nft_set_elem_expired(&e->ext, tstamp)) {
1752                         if (!nft_trans_gc_space(gc)) {
1753                                 gc = nft_trans_gc_alloc(set, 0, GFP_KERNEL);
1754                                 if (!gc)

> I confirmed it on an unpatched 7.3-rc6 + KASAN: add 20000 elements with
> "timeout 10ms" to an interval+timeout pipapo set (the parse alone takes
> ~6s) and the set ends up basically empty. pipapo_gc_scan() collected the
> new, not-yet-activated elements during the same commit that added them.

How? I'm not seeing it :-(

> It's the same thing you already fixed for rbtree in 86b6471e690c, the

I thought that was about false zap of rbtree end nodes which doesn't
apply here :-(

> races the grace period just like the rbtree case, but the precondition
> (gc picking up the not-yet-active elements) reproduces every time.

How?

> If it'd help, I can respin v2 with the parse-time vs commit-time
> expiration written out in the commit message, just let me know.

Yes, please explain in detail how time can advance during transaction,
because its supposedly impossible.

  reply	other threads:[~2026-10-25  5:38 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-24 22:03 Joas Antonio dos Santos
2026-10-24 22:23 ` Florian Westphal
2026-10-24 22:43   ` Joas Antonio dos Santos
2026-10-25  5:38     ` Florian Westphal [this message]
2026-10-25 16:48       ` Joas Antonio

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=at2V3g-B1Ko2x1iK@strlen.de \
    --to=fw@strlen.de \
    --cc=bestswngs@gmail.com \
    --cc=coreteam@netfilter.org \
    --cc=joasantonio108@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=pablo@netfilter.org \
    --cc=phil@nwl.cc \
    /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

all inboxes | Powered by JetHome®