Re: nft_pipapo_avx2_lookup backtrace in linux 5.10

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.



[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux