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