Message ID | 20240724081305.3152-2-pablo@netfilter.org (mailing list archive) |
---|---|
State | Accepted |
Commit | a16909ae9982e931841c456061cb57fbaec9c59e |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,1/1] netfilter: nft_set_pipapo_avx2: disable softinterrupts | expand |
Hello: This patch was applied to netdev/net.git (main) by Pablo Neira Ayuso <pablo@netfilter.org>: On Wed, 24 Jul 2024 10:13:05 +0200 you wrote: > From: Florian Westphal <fw@strlen.de> > > We need to disable softinterrupts, else we get following problem: > > 1. pipapo_avx2 called from process context; fpu usable > 2. preempt_disable() called, pcpu scratchmap in use > 3. softirq handles rx or tx, we re-enter pipapo_avx2 > 4. fpu busy, fallback to generic non-avx version > 5. fallback reuses scratch map and index, which are in use > by the preempted process > > [...] Here is the summary with links: - [net,1/1] netfilter: nft_set_pipapo_avx2: disable softinterrupts https://git.kernel.org/netdev/net/c/a16909ae9982 You are awesome, thank you!
diff --git a/net/netfilter/nft_set_pipapo_avx2.c b/net/netfilter/nft_set_pipapo_avx2.c index 8910a5ac7ed1..b8d3c3213efe 100644 --- a/net/netfilter/nft_set_pipapo_avx2.c +++ b/net/netfilter/nft_set_pipapo_avx2.c @@ -1139,8 +1139,14 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, bool map_index; int i, ret = 0; - if (unlikely(!irq_fpu_usable())) - return nft_pipapo_lookup(net, set, key, ext); + local_bh_disable(); + + if (unlikely(!irq_fpu_usable())) { + bool fallback_res = nft_pipapo_lookup(net, set, key, ext); + + local_bh_enable(); + return fallback_res; + } m = rcu_dereference(priv->match); @@ -1155,6 +1161,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, scratch = *raw_cpu_ptr(m->scratch); if (unlikely(!scratch)) { kernel_fpu_end(); + local_bh_enable(); return false; } @@ -1235,6 +1242,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, if (i % 2) scratch->map_index = !map_index; kernel_fpu_end(); + local_bh_enable(); return ret >= 0; }