[PATCH v7 47/47] net/sxe2: fix VEC mode selection in mode set functions

liujie5 at linkdatatechnology.com liujie5 at linkdatatechnology.com
Mon Aug 31 04:45:49 CEST 2026


From: Jie Liu <liujie5 at linkdatatechnology.com>

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: stable at dpdk.org
Signed-off-by: Jie Liu <liujie5 at linkdatatechnology.com>
---
 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 f7276f6a19..824ac1a3f2 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



More information about the dev mailing list