[PATCH 1/2] net/ice: properly handle TM hierarchy deletion

Ciara Loftus ciara.loftus at intel.com
Fri May 1 12:57:54 CEST 2026


From: Mukul Katiyar <mukul at versa-networks.com>

When a TM hierarchy is fully deleted and then committed, the hardware
scheduler nodes may be left with any bandwidth limits that were
programmed by the previous hierarchy commit. These stale limits may
remain in effect the next time the device starts, permanently throttling
traffic even though the TM hierarchy was removed.

Fix this by resetting all descendant hardware scheduler nodes to their
default state when committing an empty hierarchy. Also restore the port
queue count to its hardware default and clear the committed flag so the
port starts cleanly without any TM configuration applied.

Fixes: 715d449a965b ("net/ice: enhance Tx scheduler hierarchy support")
Cc: stable at dpdk.org

Signed-off-by: Mukul Katiyar <mukul at versa-networks.com>
Signed-off-by: Ciara Loftus <ciara.loftus at intel.com>
---
 .mailmap                       |  1 +
 drivers/net/intel/ice/ice_tm.c | 20 ++++++++++++++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/.mailmap b/.mailmap
index 7e23e2f528..e65a0c6b20 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1129,6 +1129,7 @@ Moti Haimovsky <motih at mellanox.com>
 Muhammad Ahmad <muhammad.ahmad at emumba.com>
 Muhammad Bilal <m.bilal at emumba.com>
 Mukesh Dua <mukesh.dua81 at gmail.com>
+Mukul Katiyar <mukul at versa-networks.com>
 Murphy Yang <murphyx.yang at intel.com>
 Murthy NSSR <nidadavolu.murthy at caviumnetworks.com>
 Muthurajan Jayakumar <muthurajan.jayakumar at intel.com>
diff --git a/drivers/net/intel/ice/ice_tm.c b/drivers/net/intel/ice/ice_tm.c
index ff53f2acfd..4dcfb15c27 100644
--- a/drivers/net/intel/ice/ice_tm.c
+++ b/drivers/net/intel/ice/ice_tm.c
@@ -805,6 +805,19 @@ create_sched_node_recursive(struct ice_pf *pf, struct ice_port_info *pi,
 	return 0;
 }
 
+static void
+reset_hw_node_recursive(struct ice_hw *hw, struct ice_sched_node *node)
+{
+	uint16_t i;
+
+	for (i = 0; i < node->num_children; i++) {
+		reset_hw_node_recursive(hw, node->children[i]);
+		if (ice_cfg_hw_node(hw, NULL, node->children[i]))
+			PMD_DRV_LOG(WARNING, "Failed to reset node %u to default configuration",
+					node->children[i]->info.node_teid);
+	}
+}
+
 static int
 commit_new_hierarchy(struct rte_eth_dev *dev)
 {
@@ -820,8 +833,11 @@ commit_new_hierarchy(struct rte_eth_dev *dev)
 	struct ice_sched_node *new_vsi_root = hw->vsi_ctx[pf->main_vsi->idx]->sched.vsi_node[0];
 
 	if (sw_root == NULL) {
-		PMD_DRV_LOG(ERR, "No root node defined in TM hierarchy");
-		return -1;
+		/* TM hierarchy deleted. Restore default scheduler state. */
+		reset_hw_node_recursive(hw, hw->vsi_ctx[pf->main_vsi->idx]->sched.vsi_node[0]);
+		pf->main_vsi->nb_qps = pf->lan_nb_qps;
+		pf->tm_conf.committed = false;
+		return ice_alloc_lan_q_ctx(hw, 0, 0, pf->main_vsi->nb_qps);
 	}
 
 	/* handle case where VSI node needs to move DOWN the hierarchy */
-- 
2.43.0



More information about the stable mailing list