From: Mukul Katiyar <[email protected]>

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: [email protected]

Signed-off-by: Mukul Katiyar <[email protected]>
Signed-off-by: Ciara Loftus <[email protected]>
---
v2:
* Ensure restore is only performed if a hierarchy has already been
committed
---
 .mailmap                       |  1 +
 drivers/net/intel/ice/ice_tm.c | 24 ++++++++++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/.mailmap b/.mailmap
index 22476860ed..2f96e80f16 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1132,6 +1132,7 @@ Moti Haimovsky <[email protected]>
 Muhammad Ahmad <[email protected]>
 Muhammad Bilal <[email protected]>
 Mukesh Dua <[email protected]>
+Mukul Katiyar <[email protected]>
 Murphy Yang <[email protected]>
 Murthy NSSR <[email protected]>
 Muthurajan Jayakumar <[email protected]>
diff --git a/drivers/net/intel/ice/ice_tm.c b/drivers/net/intel/ice/ice_tm.c
index ff53f2acfd..2bb684bb02 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,15 @@ 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;
+               if (!pf->tm_conf.committed) {
+                       PMD_DRV_LOG(ERR, "No root node defined in TM 
hierarchy");
+                       return -EINVAL;
+               }
+               /* 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

Reply via email to