[PATCH v2 00/36] combine multiple Intel scalar Tx paths

Bruce Richardson bruce.richardson at intel.com
Tue Jan 13 16:14:24 CET 2026


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.

Once merged, we can then optimize the drivers a bit to improve
performance, and also easily extend some drivers to use additional
paths for better performance, e.g. add the "simple scalar" path
to IDPF driver for better performance on platforms without AVX.

V2:
 - reworked the simple-scalar path as well as full scalar one
 - added simple scalar path support to idpf driver
 - small cleanups, e.g. issues flagged by checkpatch

Bruce Richardson (36):
  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
  eal: add macro for marking assumed alignment
  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
  net/intel: merge ring writes in simple Tx for ice and i40e
  net/intel: consolidate ice and i40e buffer free function
  net/intel: complete merging simple Tx paths
  net/intel: use non-volatile stores in simple Tx function
  net/intel: align scalar simple Tx path with vector logic
  net/intel: use vector SW ring entry for simple path
  net/intel: use vector mbuf cleanup from simple scalar path
  net/idpf: enable simple Tx function

 doc/guides/nics/i40e.rst                      |  18 +
 drivers/net/intel/common/tx.h                 | 116 ++-
 drivers/net/intel/common/tx_scalar_fns.h      | 595 ++++++++++++++
 drivers/net/intel/cpfl/cpfl_rxtx.c            |   8 +-
 drivers/net/intel/i40e/i40e_fdir.c            |  34 +-
 drivers/net/intel/i40e/i40e_rxtx.c            | 670 +++-------------
 drivers/net/intel/i40e/i40e_rxtx.h            |  16 -
 .../net/intel/i40e/i40e_rxtx_vec_altivec.c    |  25 +-
 drivers/net/intel/i40e/i40e_rxtx_vec_avx2.c   |  36 +-
 drivers/net/intel/i40e/i40e_rxtx_vec_avx512.c |  52 +-
 drivers/net/intel/i40e/i40e_rxtx_vec_common.h |   6 +-
 drivers/net/intel/i40e/i40e_rxtx_vec_neon.c   |  25 +-
 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   |  55 +-
 drivers/net/intel/iavf/iavf_rxtx_vec_avx512.c | 104 +--
 drivers/net/intel/iavf/iavf_rxtx_vec_common.h |  36 +-
 drivers/net/intel/ice/ice_dcf_ethdev.c        |  10 +-
 drivers/net/intel/ice/ice_rxtx.c              | 737 ++++--------------
 drivers/net/intel/ice/ice_rxtx.h              |  15 -
 drivers/net/intel/ice/ice_rxtx_vec_avx2.c     |  55 +-
 drivers/net/intel/ice/ice_rxtx_vec_avx512.c   |  53 +-
 drivers/net/intel/ice/ice_rxtx_vec_common.h   |  43 +-
 drivers/net/intel/idpf/idpf_common_device.h   |   2 +
 drivers/net/intel/idpf/idpf_common_rxtx.c     | 315 ++------
 drivers/net/intel/idpf/idpf_common_rxtx.h     |  24 +-
 .../net/intel/idpf/idpf_common_rxtx_avx2.c    |  53 +-
 .../net/intel/idpf/idpf_common_rxtx_avx512.c  |  55 +-
 drivers/net/intel/idpf/idpf_rxtx.c            |  43 +-
 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   |   3 +-
 lib/eal/include/rte_common.h                  |   6 +
 33 files changed, 1565 insertions(+), 2426 deletions(-)
 create mode 100644 drivers/net/intel/common/tx_scalar_fns.h

--
2.51.0



More information about the dev mailing list