RE: [PATCH v3 05/36] net/intel: create separate header for Tx scalar fns

Loftus, Ciara
2026-02-06T10:23:49Z

> Subject: [PATCH v3 05/36] net/intel: create separate header for Tx scalar fns
>
> Rather than having all Tx code in the one file, which could start
> getting rather long, move the scalar datapath functions to a new header
> file.
>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
> drivers/net/intel/common/tx.h | 58 ++------------------
> drivers/net/intel/common/tx_scalar_fns.h | 67
> ++++++++++++++++++++++++
> 2 files changed, 72 insertions(+), 53 deletions(-)
> create mode 100644 drivers/net/intel/common/tx_scalar_fns.h

Why not create the file when ci_tx_xmit_cleanup was first introduced?
I prefer the naming tx_scalar.h but keep tx_scalar_fns.h if you feel it's better.

>
> diff --git a/drivers/net/intel/common/tx.h b/drivers/net/intel/common/tx.h
> index 03245d4fba..01e42303b4 100644
> --- a/drivers/net/intel/common/tx.h
> +++ b/drivers/net/intel/common/tx.h
> @@ -319,59 +319,6 @@ ci_tx_free_bufs_vec(struct ci_tx_queue *txq,
> ci_desc_done_fn desc_done, bool ctx
> return txq->tx_rs_thresh;
> }
>
> -/*
> - * Common transmit descriptor cleanup function for Intel drivers.
> - * Used by ice, i40e, iavf, and idpf drivers.
> - *
> - * Returns:
> - * 0 on success
> - * -1 if cleanup cannot proceed (descriptors not yet processed by HW)
> - */
> -static __rte_always_inline int
> -ci_tx_xmit_cleanup(struct ci_tx_queue *txq)
> -{
> - struct ci_tx_entry *sw_ring = txq->sw_ring;
> - volatile struct ci_tx_desc *txd = txq->ci_tx_ring;
> - uint16_t last_desc_cleaned = txq->last_desc_cleaned;
> - uint16_t nb_tx_desc = txq->nb_tx_desc;
> - uint16_t desc_to_clean_to;
> - uint16_t nb_tx_to_clean;
> -
> - /* Determine the last descriptor needing to be cleaned */
> - desc_to_clean_to = (uint16_t)(last_desc_cleaned + txq->tx_rs_thresh);
> - if (desc_to_clean_to >= nb_tx_desc)
> - desc_to_clean_to = (uint16_t)(desc_to_clean_to -
> nb_tx_desc);
> -
> - /* Check to make sure the last descriptor to clean is done */
> - desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
> -
> - /* Check if descriptor is done - all drivers use 0xF as done value in bits
> 3:0 */
> - if ((txd[desc_to_clean_to].cmd_type_offset_bsz &
> rte_cpu_to_le_64(CI_TXD_QW1_DTYPE_M)) !=
> - rte_cpu_to_le_64(CI_TX_DESC_DTYPE_DESC_DONE))
> {
> - /* Descriptor not yet processed by hardware */
> - return -1;
> - }
> -
> - /* Figure out how many descriptors will be cleaned */
> - if (last_desc_cleaned > desc_to_clean_to)
> - nb_tx_to_clean = (uint16_t)((nb_tx_desc - last_desc_cleaned)
> + desc_to_clean_to);
> - else
> - nb_tx_to_clean = (uint16_t)(desc_to_clean_to -
> last_desc_cleaned);
> -
> - /* The last descriptor to clean is done, so that means all the
> - * descriptors from the last descriptor that was cleaned
> - * up to the last descriptor with the RS bit set
> - * are done. Only reset the threshold descriptor.
> - */
> - txd[desc_to_clean_to].cmd_type_offset_bsz = 0;
> -
> - /* Update the txq to reflect the last descriptor that was cleaned */
> - txq->last_desc_cleaned = desc_to_clean_to;
> - txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + nb_tx_to_clean);
> -
> - return 0;
> -}
> -
> static inline void
> ci_txq_release_all_mbufs(struct ci_tx_queue *txq, bool use_ctx)
> {
> @@ -490,4 +437,9 @@ ci_tx_path_select(const struct ci_tx_path_features
> *req_features,
> return idx;
> }
>
> +/* include the scalar functions at the end, so they can use the common
> definitions.
> + * This is done so drivers can use all functions just by including tx.h
> + */
> +#include "tx_scalar_fns.h"
> +
> #endif /* _COMMON_INTEL_TX_H_ */
> diff --git a/drivers/net/intel/common/tx_scalar_fns.h
> b/drivers/net/intel/common/tx_scalar_fns.h
> new file mode 100644
> index 0000000000..c79210d084
> --- /dev/null
> +++ b/drivers/net/intel/common/tx_scalar_fns.h
> @@ -0,0 +1,67 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2025 Intel Corporation

Should this be 2026?

> + */
> +
> +#ifndef _COMMON_INTEL_TX_SCALAR_FNS_H_
> +#define _COMMON_INTEL_TX_SCALAR_FNS_H_
> +
> +#include <stdint.h>
> +#include <rte_byteorder.h>
> +
> +/* depends on common Tx definitions. */
> +#include "tx.h"
> +
> +/*
> + * Common transmit descriptor cleanup function for Intel drivers.
> + * Used by ice, i40e, iavf, and idpf drivers.

Do we need to call out the driver names in the comment? If a new driver
were to adopt this function they would need to patch this file too to
update the comment.

> + *
> + * Returns:
> + * 0 on success
> + * -1 if cleanup cannot proceed (descriptors not yet processed by HW)
> + */
> +static __rte_always_inline int
> +ci_tx_xmit_cleanup(struct ci_tx_queue *txq)
> +{
> + struct ci_tx_entry *sw_ring = txq->sw_ring;
> + volatile struct ci_tx_desc *txd = txq->ci_tx_ring;
> + uint16_t last_desc_cleaned = txq->last_desc_cleaned;
> + uint16_t nb_tx_desc = txq->nb_tx_desc;
> + uint16_t desc_to_clean_to;
> + uint16_t nb_tx_to_clean;
> +
> + /* Determine the last descriptor needing to be cleaned */
> + desc_to_clean_to = (uint16_t)(last_desc_cleaned + txq->tx_rs_thresh);
> + if (desc_to_clean_to >= nb_tx_desc)
> + desc_to_clean_to = (uint16_t)(desc_to_clean_to -
> nb_tx_desc);
> +
> + /* Check to make sure the last descriptor to clean is done */
> + desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
> +
> + /* Check if descriptor is done - all drivers use 0xF as done value in bits
> 3:0 */
> + if ((txd[desc_to_clean_to].cmd_type_offset_bsz &
> rte_cpu_to_le_64(CI_TXD_QW1_DTYPE_M)) !=
> + rte_cpu_to_le_64(CI_TX_DESC_DTYPE_DESC_DONE))
> {
> + /* Descriptor not yet processed by hardware */
> + return -1;
> + }
> +
> + /* Figure out how many descriptors will be cleaned */
> + if (last_desc_cleaned > desc_to_clean_to)
> + nb_tx_to_clean = (uint16_t)((nb_tx_desc - last_desc_cleaned)
> + desc_to_clean_to);
> + else
> + nb_tx_to_clean = (uint16_t)(desc_to_clean_to -
> last_desc_cleaned);
> +
> + /* The last descriptor to clean is done, so that means all the
> + * descriptors from the last descriptor that was cleaned
> + * up to the last descriptor with the RS bit set
> + * are done. Only reset the threshold descriptor.
> + */
> + txd[desc_to_clean_to].cmd_type_offset_bsz = 0;
> +
> + /* Update the txq to reflect the last descriptor that was cleaned */
> + txq->last_desc_cleaned = desc_to_clean_to;
> + txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + nb_tx_to_clean);
> +
> + return 0;
> +}
> +
> +#endif /* _COMMON_INTEL_TX_SCALAR_FNS_H_ */
> --
> 2.51.0