Message ID | 20240822101842.4234-2-pablo@netfilter.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 1eacdd71b3436b54d5fc8218c4bb0187d92a6892 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,1/3] netfilter: nft_counter: Disable BH in nft_counter_offload_stats(). | expand |
Hello: This series was applied to netdev/net.git (main) by Pablo Neira Ayuso <pablo@netfilter.org>: On Thu, 22 Aug 2024 12:18:40 +0200 you wrote: > From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > > The sequence counter nft_counter_seq is a per-CPU counter. There is no > lock associated with it. nft_counter_do_eval() is using the same counter > and disables BH which suggest that it can be invoked from a softirq. > This in turn means that nft_counter_offload_stats(), which disables only > preemption, can be interrupted by nft_counter_do_eval() leading to two > writer for one seqcount_t. > This can lead to loosing stats or reading statistics while they are > updated. > > [...] Here is the summary with links: - [net,1/3] netfilter: nft_counter: Disable BH in nft_counter_offload_stats(). https://git.kernel.org/netdev/net/c/1eacdd71b343 - [net,2/3] netfilter: nft_counter: Synchronize nft_counter_reset() against reader. https://git.kernel.org/netdev/net/c/a0b39e2dc701 - [net,3/3] netfilter: flowtable: validate vlan header https://git.kernel.org/netdev/net/c/6ea14ccb60c8 You are awesome, thank you!
diff --git a/net/netfilter/nft_counter.c b/net/netfilter/nft_counter.c index 291ed2026367..16f40b503d37 100644 --- a/net/netfilter/nft_counter.c +++ b/net/netfilter/nft_counter.c @@ -265,7 +265,7 @@ static void nft_counter_offload_stats(struct nft_expr *expr, struct nft_counter *this_cpu; seqcount_t *myseq; - preempt_disable(); + local_bh_disable(); this_cpu = this_cpu_ptr(priv->counter); myseq = this_cpu_ptr(&nft_counter_seq); @@ -273,7 +273,7 @@ static void nft_counter_offload_stats(struct nft_expr *expr, this_cpu->packets += stats->pkts; this_cpu->bytes += stats->bytes; write_seqcount_end(myseq); - preempt_enable(); + local_bh_enable(); } void nft_counter_init_seqcount(void)