Move kernel_fpu_begin_mask()/ _end() to pipapo_get_avx2() where it is required. This is a preparation for adding local_lock_t to struct nft_pipapo_scratch in order to protect the __map pointer. The lock can not be acquired in preemption disabled context which is what kernel_fpu_begin*() does. Signed-off-by: Sebastian Andrzej Siewior --- net/netfilter/nft_set_pipapo.c | 2 -- net/netfilter/nft_set_pipapo_avx2.c | 15 +++++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/net/netfilter/nft_set_pipapo.c b/net/netfilter/nft_set_pipapo.c index 515eb64bff9f8..1a1ba0b47696e 100644 --- a/net/netfilter/nft_set_pipapo.c +++ b/net/netfilter/nft_set_pipapo.c @@ -528,9 +528,7 @@ static struct nft_pipapo_elem *pipapo_get(const struct nft_pipapo_match *m, #if defined(CONFIG_X86_64) && !defined(CONFIG_UML) if (boot_cpu_has(X86_FEATURE_AVX2) && boot_cpu_has(X86_FEATURE_AVX) && irq_fpu_usable()) { - kernel_fpu_begin_mask(0); e = pipapo_get_avx2(m, data, genmask, tstamp); - kernel_fpu_end(); local_bh_enable(); return e; } diff --git a/net/netfilter/nft_set_pipapo_avx2.c b/net/netfilter/nft_set_pipapo_avx2.c index a584ffff73769..951868a904a25 100644 --- a/net/netfilter/nft_set_pipapo_avx2.c +++ b/net/netfilter/nft_set_pipapo_avx2.c @@ -1170,6 +1170,12 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m, pipapo_resmap_init_avx2(m, res); + /* Note that we don't need a valid MXCSR state for any of the + * operations we use here, so pass 0 as mask and spare a LDMXCSR + * instruction. + */ + kernel_fpu_begin_mask(0); + nft_pipapo_avx2_prepare(); next_match: @@ -1221,6 +1227,7 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m, if (ret < 0) { scratch->map_index = map_index; + kernel_fpu_end(); return NULL; } @@ -1233,6 +1240,7 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m, goto next_match; scratch->map_index = map_index; + kernel_fpu_end(); return e; } @@ -1241,6 +1249,7 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m, data += NFT_PIPAPO_GROUPS_PADDED_SIZE(f); } + kernel_fpu_end(); return NULL; } @@ -1280,13 +1289,7 @@ nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set, m = rcu_dereference(priv->match); - /* Note that we don't need a valid MXCSR state for any of the - * operations we use here, so pass 0 as mask and spare a LDMXCSR - * instruction. - */ - kernel_fpu_begin_mask(0); e = pipapo_get_avx2(m, rp, genmask, get_jiffies_64()); - kernel_fpu_end(); local_bh_enable(); return e ? &e->ext : NULL; -- 2.50.1