[RFC PATCH 00/27] combine multiple Intel scalar Tx paths

Bruce Richardson
2025-12-19T17:26:09Z

The scalar Tx paths, with support for offloads and multiple mbufs
per packet, are almost identical across drivers ice, i40e, iavf and
the single-queue mode of idpf. Therefore, we can do some rework to
combine these code paths into a single function which is parameterized
by compile-time constants, allowing code saving to give us a single
path to optimize and maintain - apart from edge cases like IPSec
support in iavf.

The ixgbe driver has a number of similarities too, which we take
advantage of where we can, but the overall descriptor format is
sufficiently different that its main scalar code path is kept
separate.

Bruce Richardson (27):
net/intel: create common Tx descriptor structure
net/intel: use common tx ring structure
net/intel: create common post-Tx cleanup function
net/intel: consolidate definitions for Tx desc fields
net/intel: create separate header for Tx scalar fns
net/intel: add common fn to calculate needed descriptors
net/ice: refactor context descriptor handling
net/i40e: refactor context descriptor handling
net/idpf: refactor context descriptor handling
net/intel: consolidate checksum mask definition
net/intel: create common checksum Tx offload function
net/intel: create a common scalar Tx function
net/i40e: use common scalar Tx function
net/intel: add IPSec hooks to common Tx function
net/intel: support configurable VLAN tag insertion on Tx
net/iavf: use common scalar Tx function
net/i40e: document requirement for QinQ support
net/idpf: use common scalar Tx function
net/intel: avoid writing the final pkt descriptor twice
net/intel: write descriptors using non-volatile pointers
net/intel: remove unnecessary flag clearing
net/intel: mark mid-burst ring cleanup as unlikely
net/intel: add special handling for single desc packets
net/intel: use separate array for desc status tracking
net/ixgbe: use separate array for desc status tracking
net/intel: drop unused Tx queue used count
net/intel: remove index for tracking end of packet

doc/guides/nics/i40e.rst | 18 +
drivers/net/intel/common/tx.h | 101 ++-
drivers/net/intel/common/tx_scalar_fns.h | 441 ++++++++++++
drivers/net/intel/cpfl/cpfl_rxtx.c | 4 +-
drivers/net/intel/i40e/i40e_fdir.c | 34 +-
drivers/net/intel/i40e/i40e_rxtx.c | 500 +++-----------
drivers/net/intel/i40e/i40e_rxtx.h | 17 +-
.../net/intel/i40e/i40e_rxtx_vec_altivec.c | 23 +-
drivers/net/intel/i40e/i40e_rxtx_vec_avx2.c | 34 +-
drivers/net/intel/i40e/i40e_rxtx_vec_avx512.c | 50 +-
drivers/net/intel/i40e/i40e_rxtx_vec_common.h | 6 +-
drivers/net/intel/i40e/i40e_rxtx_vec_neon.c | 23 +-
drivers/net/intel/i40e/i40e_rxtx_vec_sse.c | 23 +-
drivers/net/intel/iavf/iavf_rxtx.c | 642 ++++--------------
drivers/net/intel/iavf/iavf_rxtx.h | 30 +-
drivers/net/intel/iavf/iavf_rxtx_vec_avx2.c | 53 +-
drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c | 104 ++-
drivers/net/intel/iavf/iavf_rxtx_vec_common.h | 36 +-
drivers/net/intel/iavf/iavf_rxtx_vec_sse.c | 27 +-
drivers/net/intel/ice/ice_dcf_ethdev.c | 10 +-
drivers/net/intel/ice/ice_rxtx.c | 590 +++++-----------
drivers/net/intel/ice/ice_rxtx.h | 15 +-
drivers/net/intel/ice/ice_rxtx_vec_avx2.c | 53 +-
drivers/net/intel/ice/ice_rxtx_vec_avx512.c | 51 +-
drivers/net/intel/ice/ice_rxtx_vec_common.h | 43 +-
drivers/net/intel/ice/ice_rxtx_vec_sse.c | 24 +-
drivers/net/intel/idpf/idpf_common_rxtx.c | 298 ++------
drivers/net/intel/idpf/idpf_common_rxtx.h | 21 +-
.../net/intel/idpf/idpf_common_rxtx_avx2.c | 53 +-
.../net/intel/idpf/idpf_common_rxtx_avx512.c | 53 +-
drivers/net/intel/idpf/idpf_rxtx.c | 17 +-
drivers/net/intel/idpf/idpf_rxtx_vec_common.h | 6 +-
drivers/net/intel/ixgbe/ixgbe_rxtx.c | 103 ++-
.../net/intel/ixgbe/ixgbe_rxtx_vec_common.c | 1 -
34 files changed, 1394 insertions(+), 2110 deletions(-)
create mode 100644 drivers/net/intel/common/tx_scalar_fns.h

--
2.51.0