On Tue, May 05, 2026 at 12:31:57PM +0000, Ciara Loftus wrote:
> The leaf node ID boundary is checked against the compile-time constant
> `RTE_MAX_QUEUES_PER_PORT` (1024) rather than the number of Tx queues
> configured for the port. The rte_tm specification reserves IDs 0 to
> (N-1) for leaf nodes, where N is the configured queue count, so using
> the constant produces wrong results whenever N is less than 1024. Fix by
> replacing the constant with the runtime queue count.
> 
> Also add an explicit check in the non-leaf validation path that rejects
> IDs in the leaf-reserved range. This condition can be triggered
> two ways: adding a leaf node before its parent chain is complete (the
> node resolves to a non-leaf level), or assigning a leaf-range ID to a
> node intended as non-leaf.
> 
> Fixes: 715d449a965b ("net/ice: enhance Tx scheduler hierarchy support")

I think this fix will cause other issues when we want to use large numbers
of queues. From the commit log for 715d449a965b:

    "If the HW/firmware allows it, allow creating up to 2k child
    nodes per scheduler node. Also expand the number of supported layers to
    the max available, rather than always just having 3 layers.  One
    restriction on this change is that the topology needs to be configured
    and enabled before port queue setup"

The last part is significant - the number of configured queues must be
supported by a scheduler hierarchy with enough nodes at the next,
queue-group level. Therefore, before configuring large numbers of queues we
need to configure a non-default hierarchy. Therefore, when running this
check the value of nb_txq is not known, which is why the original patch
changed the check to RTE_MAX_QUEUES_PER_PORT.

However, you correctly point out in this fix, that that is not according to
the spec for rte_tm. Therefore, I suggest changing the check, if possible:

* if nb_txq == 0 (i.e. no queues configured yet), then keep as-is with
  MAX_QUEUES
* for cases where nb_txq != 0, then use nb_txq.

Does that seem sensible, or any better alternatives you can see?

/Bruce


> Cc: [email protected]
> 
> Signed-off-by: Ciara Loftus <[email protected]>
> ---
>  drivers/net/intel/ice/ice_tm.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/intel/ice/ice_tm.c b/drivers/net/intel/ice/ice_tm.c
> index ff53f2acfd..7ee4070007 100644
> --- a/drivers/net/intel/ice/ice_tm.c
> +++ b/drivers/net/intel/ice/ice_tm.c
> @@ -88,6 +88,7 @@ ice_node_param_check(uint32_t node_id,
>                     uint32_t priority, uint32_t weight,
>                     const struct rte_tm_node_params *params,
>                     bool is_leaf,
> +                   uint16_t nb_txq,
>                     struct rte_tm_error *error)
>  {
>       /* checked all the unsupported parameter */
> @@ -123,6 +124,11 @@ ice_node_param_check(uint32_t node_id,
>  
>       /* for non-leaf node */
>       if (!is_leaf) {
> +             if (node_id < nb_txq) {
> +                     error->type = RTE_TM_ERROR_TYPE_NODE_ID;
> +                     error->message = "node ID is reserved for leaf nodes";
> +                     return -EINVAL;
> +             }
>               if (params->nonleaf.wfq_weight_mode) {
>                       error->type =
>                               RTE_TM_ERROR_TYPE_NODE_PARAMS_WFQ_WEIGHT_MODE;
> @@ -146,7 +152,7 @@ ice_node_param_check(uint32_t node_id,
>       }
>  
>       /* for leaf node */
> -     if (node_id >= RTE_MAX_QUEUES_PER_PORT) {
> +     if (node_id >= nb_txq) {
>               error->type = RTE_TM_ERROR_TYPE_NODE_ID;
>               error->message = "Node ID out of range for a leaf node.";
>               return -EINVAL;
> @@ -440,7 +446,8 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
>                       return -EINVAL;
>               }
>  
> -             ret = ice_node_param_check(node_id, priority, weight, params, 
> false, error);
> +             ret = ice_node_param_check(node_id, priority, weight, params, 
> false,
> +                             dev->data->nb_tx_queues, error);
>               if (ret)
>                       return ret;
>  
> @@ -479,7 +486,8 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
>       }
>  
>       ret = ice_node_param_check(node_id, priority, weight,
> -                     params, level_id == ice_get_leaf_level(pf), error);
> +                     params, level_id == ice_get_leaf_level(pf),
> +                     dev->data->nb_tx_queues, error);
>       if (ret)
>               return ret;
>  
> -- 
> 2.43.0
> 

Reply via email to