Message ID | 1551172436-5233-1-git-send-email-lirongqing@baidu.com |
---|---|
State | Accepted |
Delegated to: | Pablo Neira |
Headers | show |
Series | [v2] netfilter: check the result of dereferencing base_chain->stats | expand |
On Tue, Feb 26, 2019 at 05:13:56PM +0800, Li RongQing wrote: > check the result of dereferencing base_chain->stats, instead of > result of this_cpu_ptr with NULL > > base_chain->stats maybe be changed to NULL when a chain is > updated and a new NULL counter can be attached > > and we do not need to check returning of this_cpu_ptr since > base_chain->stats is from percpu allocator if it is non-NULL, > this_cpu_ptr returns a valid value > > and fix two sparse error by replacing rcu_access_pointer and > rcu_dereference with READ_ONCE under rcu_read_lock > > Thanks for Eric's help to finish this patch Applied, thanks!
diff --git a/net/netfilter/nf_tables_core.c b/net/netfilter/nf_tables_core.c index 2a00aef7b6d4..7dfbc6746846 100644 --- a/net/netfilter/nf_tables_core.c +++ b/net/netfilter/nf_tables_core.c @@ -98,21 +98,23 @@ static noinline void nft_update_chain_stats(const struct nft_chain *chain, const struct nft_pktinfo *pkt) { struct nft_base_chain *base_chain; + struct nft_stats __percpu *pstats; struct nft_stats *stats; base_chain = nft_base_chain(chain); - if (!rcu_access_pointer(base_chain->stats)) - return; - local_bh_disable(); - stats = this_cpu_ptr(rcu_dereference(base_chain->stats)); - if (stats) { + rcu_read_lock(); + pstats = READ_ONCE(base_chain->stats); + if (pstats) { + local_bh_disable(); + stats = this_cpu_ptr(pstats); u64_stats_update_begin(&stats->syncp); stats->pkts++; stats->bytes += pkt->skb->len; u64_stats_update_end(&stats->syncp); + local_bh_enable(); } - local_bh_enable(); + rcu_read_unlock(); } struct nft_jumpstack {