public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] netfilter: nft_counter: Fix reset of counters on 32bit archs
@ 2026-02-03 13:48 anders.grahn
  2026-02-03 13:54 ` Florian Westphal
  0 siblings, 1 reply; 3+ messages in thread
From: anders.grahn @ 2026-02-03 13:48 UTC (permalink / raw)
  To: Pablo Neira Ayuso, Florian Westphal, Phil Sutter, David S. Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, Simon Horman,
	Sebastian Andrzej Siewior
  Cc: Anders Grahn, linux-kernel, netfilter-devel, coreteam, netdev

From: Anders Grahn <anders.grahn@gmail.com>

nft_counter_reset() calls u64_stats_add() with a negative value to reset
the counter. This will work on 64bit archs, hence the negative value
added will wrap as a 64bit value which then can wrap the stat counter as
well.

On 32bit archs, the added negative value will wrap as a 32bit value and
_not_ wrapping the stat counter properly. In most cases, this would just
lead to a very large 32bit value being added to the stat counter.

Fix by introducing u64_stats_sub().

Fixes: 4a1d3acd6ea8 ("netfilter: nft_counter: Use u64_stats_t for statistic.")
Signed-off-by: Anders Grahn <anders.grahn@gmail.com>
---
 include/linux/u64_stats_sync.h | 10 ++++++++++
 net/netfilter/nft_counter.c    |  4 ++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h
index 457879938fc1..3366090a86bd 100644
--- a/include/linux/u64_stats_sync.h
+++ b/include/linux/u64_stats_sync.h
@@ -89,6 +89,11 @@ static inline void u64_stats_add(u64_stats_t *p, unsigned long val)
 	local64_add(val, &p->v);
 }
 
+static inline void u64_stats_sub(u64_stats_t *p, s64 val)
+{
+	local64_sub(val, &p->v);
+}
+
 static inline void u64_stats_inc(u64_stats_t *p)
 {
 	local64_inc(&p->v);
@@ -130,6 +135,11 @@ static inline void u64_stats_add(u64_stats_t *p, unsigned long val)
 	p->v += val;
 }
 
+static inline void u64_stats_sub(u64_stats_t *p, s64 val)
+{
+	p->v -= val;
+}
+
 static inline void u64_stats_inc(u64_stats_t *p)
 {
 	p->v++;
diff --git a/net/netfilter/nft_counter.c b/net/netfilter/nft_counter.c
index cc7325329496..0d70325280cc 100644
--- a/net/netfilter/nft_counter.c
+++ b/net/netfilter/nft_counter.c
@@ -117,8 +117,8 @@ static void nft_counter_reset(struct nft_counter_percpu_priv *priv,
 	nft_sync = this_cpu_ptr(&nft_counter_sync);
 
 	u64_stats_update_begin(nft_sync);
-	u64_stats_add(&this_cpu->packets, -total->packets);
-	u64_stats_add(&this_cpu->bytes, -total->bytes);
+	u64_stats_sub(&this_cpu->packets, total->packets);
+	u64_stats_sub(&this_cpu->bytes, total->bytes);
 	u64_stats_update_end(nft_sync);
 
 	local_bh_enable();
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] netfilter: nft_counter: Fix reset of counters on 32bit archs
  2026-02-03 13:48 [PATCH v3] netfilter: nft_counter: Fix reset of counters on 32bit archs anders.grahn
@ 2026-02-03 13:54 ` Florian Westphal
  2026-02-04  2:09   ` Jakub Kicinski
  0 siblings, 1 reply; 3+ messages in thread
From: Florian Westphal @ 2026-02-03 13:54 UTC (permalink / raw)
  To: anders.grahn
  Cc: Pablo Neira Ayuso, Phil Sutter, David S. Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, Simon Horman,
	Sebastian Andrzej Siewior, linux-kernel, netfilter-devel,
	coreteam, netdev

anders.grahn@gmail.com <anders.grahn@gmail.com> wrote:
> From: Anders Grahn <anders.grahn@gmail.com>
> 
> nft_counter_reset() calls u64_stats_add() with a negative value to reset
> the counter. This will work on 64bit archs, hence the negative value
> added will wrap as a 64bit value which then can wrap the stat counter as
> well.
> 
> On 32bit archs, the added negative value will wrap as a 32bit value and
> _not_ wrapping the stat counter properly. In most cases, this would just
> lead to a very large 32bit value being added to the stat counter.
> 
> Fix by introducing u64_stats_sub().

Thanks Anders.

I will apply this in the next days unless there is a NACK from
netdev maintainers.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3] netfilter: nft_counter: Fix reset of counters on 32bit archs
  2026-02-03 13:54 ` Florian Westphal
@ 2026-02-04  2:09   ` Jakub Kicinski
  0 siblings, 0 replies; 3+ messages in thread
From: Jakub Kicinski @ 2026-02-04  2:09 UTC (permalink / raw)
  To: Florian Westphal
  Cc: anders.grahn, Pablo Neira Ayuso, Phil Sutter, David S. Miller,
	Eric Dumazet, Paolo Abeni, Simon Horman,
	Sebastian Andrzej Siewior, linux-kernel, netfilter-devel,
	coreteam, netdev

On Tue, 3 Feb 2026 14:54:58 +0100 Florian Westphal wrote:
> I will apply this in the next days unless there is a NACK from
> netdev maintainers.

My $0.02 is that it'd be great to add a comment advising against the
use of the new helper, because normally stats shouldn't go backwards.
But I guess is equally obvious as it is hard to explain succinctly.
So ack from me.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-02-04  2:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-03 13:48 [PATCH v3] netfilter: nft_counter: Fix reset of counters on 32bit archs anders.grahn
2026-02-03 13:54 ` Florian Westphal
2026-02-04  2:09   ` Jakub Kicinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox