From: Jie Liu <[email protected]>

The Tx/Rx mode set functions pre-assigned tx_mode_flags/rx_mode_flags
from vec_flags (SXE2_{TX,RX}_MODE_VEC_SIMPLE or _VEC_OFFLOAD) before
the per-ISA capability checks. As SXE2_{TX,RX}_MODE_VEC_SET_MASK
includes the SIMPLE and OFFLOAD bits, the subsequent
"(flags & SET_MASK) == 0" guards never matched, so the AVX2 and SSE
VEC mode bits were never set and the vectorized path fell back to SSE
even when AVX2 was available.

Remove the pre-assignment and OR in "vec_flags | MODE" at each ISA
selection branch so the correct VEC mode bit is selected on every
architecture.

Fixes: ac60f302cbef ("net/sxe2: add vectorized Rx and Tx")
Cc: [email protected]
Signed-off-by: Jie Liu <[email protected]>
---
 drivers/net/sxe2/sxe2_txrx.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/drivers/net/sxe2/sxe2_txrx.c b/drivers/net/sxe2/sxe2_txrx.c
index 09f1dfe9fc..eb1092714a 100644
--- a/drivers/net/sxe2/sxe2_txrx.c
+++ b/drivers/net/sxe2/sxe2_txrx.c
@@ -319,13 +319,12 @@ void sxe2_tx_mode_func_set(struct rte_eth_dev *dev)
                ret = sxe2_tx_vec_support_check(dev, &vec_flags);
                if (ret == 0 &&
                    rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128) {
-                       tx_mode_flags = vec_flags;
 #ifdef RTE_ARCH_X86
                        if ((rte_vect_get_max_simd_bitwidth() >= 
RTE_VECT_SIMD_512) &&
                            (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 
1) &&
                            (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512BW) == 
1)) {
 #ifdef CC_AVX512_SUPPORT
-                               tx_mode_flags |= SXE2_TX_MODE_VEC_AVX512;
+                               tx_mode_flags |= (vec_flags | 
SXE2_TX_MODE_VEC_AVX512);
 #else
                                PMD_LOG_INFO(TX, "AVX512 is not supported in 
build env.");
 #endif
@@ -334,10 +333,10 @@ void sxe2_tx_mode_func_set(struct rte_eth_dev *dev)
                            ((rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 1) 
||
                            (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) == 
1)) &&
                            (rte_vect_get_max_simd_bitwidth() >= 
RTE_VECT_SIMD_256))
-                               tx_mode_flags |= SXE2_TX_MODE_VEC_AVX2;
+                               tx_mode_flags |= (vec_flags | 
SXE2_TX_MODE_VEC_AVX2);
 
                        if ((0 == (tx_mode_flags & SXE2_TX_MODE_VEC_SET_MASK)))
-                               tx_mode_flags |=  SXE2_TX_MODE_VEC_SSE;
+                               tx_mode_flags |= (vec_flags | 
SXE2_TX_MODE_VEC_SSE);
 #elif defined(RTE_ARCH_ARM64)
                        if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON) == 1)
                                tx_mode_flags |= (vec_flags | 
SXE2_TX_MODE_VEC_NEON);
@@ -520,13 +519,12 @@ void sxe2_rx_mode_func_set(struct rte_eth_dev *dev)
                ret = sxe2_rx_vec_support_check(dev, &vec_flags);
                if (ret == 0 &&
                    rte_vect_get_max_simd_bitwidth() >= RTE_VECT_SIMD_128) {
-                       rx_mode_flags = vec_flags;
 #ifdef RTE_ARCH_X86
                        if ((rte_vect_get_max_simd_bitwidth() >= 
RTE_VECT_SIMD_512) &&
                                (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) 
== 1) &&
                                (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512BW) 
== 1)) {
 #ifdef CC_AVX512_SUPPORT
-                               rx_mode_flags |= SXE2_RX_MODE_VEC_AVX512;
+                               rx_mode_flags |= (vec_flags | 
SXE2_RX_MODE_VEC_AVX512);
 #else
                                PMD_LOG_INFO(RX, "AVX512 support detected but 
not enabled");
 #endif
@@ -535,11 +533,11 @@ void sxe2_rx_mode_func_set(struct rte_eth_dev *dev)
                                ((rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2) == 
1) ||
                                (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) 
== 1)) &&
                                (rte_vect_get_max_simd_bitwidth() >= 
RTE_VECT_SIMD_256))
-                               rx_mode_flags |= SXE2_RX_MODE_VEC_AVX2;
+                               rx_mode_flags |= (vec_flags | 
SXE2_RX_MODE_VEC_AVX2);
 
                        if (((rx_mode_flags & SXE2_RX_MODE_VEC_SET_MASK) == 0) 
&&
                                rte_vect_get_max_simd_bitwidth() >= 
RTE_VECT_SIMD_128)
-                               rx_mode_flags |= SXE2_RX_MODE_VEC_SSE;
+                               rx_mode_flags |= (vec_flags | 
SXE2_RX_MODE_VEC_SSE);
 
 #elif defined(RTE_ARCH_ARM64)
                        if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON) == 1) {
-- 
2.52.0

Reply via email to