Arturo Borrero Gonzalez <arturo@xxxxxxxxxxxxx> wrote: > Hi there, > > I got this backtrace in one of my servers. I wonder if it is known or fixed > already in a later version. > > My versions: > * kernel 5.10.24 > * nft 0.9.6 > > Also, find attached the ruleset that triggered this. > > [Thu May 6 16:20:21 2021] ------------[ cut here ]------------ > [Thu May 6 16:20:21 2021] WARNING: CPU: 3 PID: 456 at > arch/x86/kernel/fpu/core.c:129 kernel_fpu_begin_mask+0xc9/0xe0 > [Thu May 6 16:20:21 2021] Modules linked in: binfmt_misc nft_nat Hmm, I suspect this is needed (not even compile tested). diff --git a/net/netfilter/nft_set_pipapo_avx2.c b/net/netfilter/nft_set_pipapo_avx2.c --- a/net/netfilter/nft_set_pipapo_avx2.c +++ b/net/netfilter/nft_set_pipapo_avx2.c @@ -1105,6 +1105,18 @@ bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features, return true; } +static void nft_pipapo_avx_begin(void) +{ + local_bh_disable(); + kernel_fpu_begin(); +} + +static void nft_pipapo_avx_end(void) +{ + kernel_fpu_end(); + local_bh_enable(); +} + /** * nft_pipapo_avx2_lookup() - Lookup function for AVX2 implementation * @net: Network namespace @@ -1134,11 +1146,11 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, m = rcu_dereference(priv->match); /* This also protects access to all data related to scratch maps */ - kernel_fpu_begin(); + nft_pipapo_avx_begin(); scratch = *raw_cpu_ptr(m->scratch_aligned); if (unlikely(!scratch)) { - kernel_fpu_end(); + nft_pipapo_avx_end(); return false; } map_index = raw_cpu_read(nft_pipapo_avx2_scratch_index); @@ -1217,7 +1229,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, out: if (i % 2) raw_cpu_write(nft_pipapo_avx2_scratch_index, !map_index); - kernel_fpu_end(); + nft_pipapo_avx_end(); return ret >= 0; } kernel_fpu_begin() disables preemption, but we can still reenter via softirq.