commit_new_hierarchy() computes the number of usable Tx queues (nb_qps)
by indexing the arrays nodes_created_per_level[] and hw->layer_info[] with
a value derived from ice_get_leaf_level(). nodes_created_per_level[] is
indexed by absolute hw scheduler layer, but ice_get_leaf_level() returns a
value relative to the TM hierarchy's root position, so the index used was
off by the number of hidden layers.

This under-counted the qgroup layer, causing nb_qps to be computed from a
shallower layer than the one actually holding the committed qgroup nodes.
In turn this caused rte_eth_dev_configure to reject any nb_tx_queues above
the miscalculated capacity.

Fix by converting the index to an absolute layer index.

Fixes: 715d449a965b ("net/ice: enhance Tx scheduler hierarchy support")
Cc: [email protected]

Signed-off-by: Ciara Loftus <[email protected]>
---
 drivers/net/intel/ice/ice_tm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/intel/ice/ice_tm.c b/drivers/net/intel/ice/ice_tm.c
index 2e6ef9c264f..651d6aa932d 100644
--- a/drivers/net/intel/ice/ice_tm.c
+++ b/drivers/net/intel/ice/ice_tm.c
@@ -848,7 +848,7 @@ commit_new_hierarchy(struct rte_eth_dev *dev)
        const uint16_t new_root_level = pf->tm_conf.hidden_layers;
        /* count nodes per hw level, not per logical */
        uint16_t nodes_created_per_level[ICE_TM_MAX_LAYERS] = {0};
-       uint8_t q_lvl = ice_get_leaf_level(pf);
+       uint8_t q_lvl = ice_get_leaf_level(pf) + pf->tm_conf.hidden_layers;
        uint8_t qg_lvl = q_lvl - 1;
        struct ice_sched_node *new_vsi_root = 
hw->vsi_ctx[pf->main_vsi->idx]->sched.vsi_node[0];
 
-- 
2.43.0

Reply via email to