Simplified struct ice_tm_conf by removing per level node list.

Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
---
 drivers/net/ice/ice_ethdev.h |   5 +-
 drivers/net/ice/ice_tm.c     | 210 +++++++++++++++--------------------
 2 files changed, 88 insertions(+), 127 deletions(-)

diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h
index ae22c29ffc..008a7a23b9 100644
--- a/drivers/net/ice/ice_ethdev.h
+++ b/drivers/net/ice/ice_ethdev.h
@@ -472,6 +472,7 @@ struct ice_tm_node {
        uint32_t id;
        uint32_t priority;
        uint32_t weight;
+       uint32_t level;
        uint32_t reference_count;
        struct ice_tm_node *parent;
        struct ice_tm_node **children;
@@ -492,10 +493,6 @@ enum ice_tm_node_type {
 struct ice_tm_conf {
        struct ice_shaper_profile_list shaper_profile_list;
        struct ice_tm_node *root; /* root node - port */
-       struct ice_tm_node_list qgroup_list; /* node list for all the queue 
groups */
-       struct ice_tm_node_list queue_list; /* node list for all the queues */
-       uint32_t nb_qgroup_node;
-       uint32_t nb_queue_node;
        bool committed;
        bool clear_on_fail;
 };
diff --git a/drivers/net/ice/ice_tm.c b/drivers/net/ice/ice_tm.c
index 7ae68c683b..7c662f8a85 100644
--- a/drivers/net/ice/ice_tm.c
+++ b/drivers/net/ice/ice_tm.c
@@ -43,66 +43,30 @@ ice_tm_conf_init(struct rte_eth_dev *dev)
        /* initialize node configuration */
        TAILQ_INIT(&pf->tm_conf.shaper_profile_list);
        pf->tm_conf.root = NULL;
-       TAILQ_INIT(&pf->tm_conf.qgroup_list);
-       TAILQ_INIT(&pf->tm_conf.queue_list);
-       pf->tm_conf.nb_qgroup_node = 0;
-       pf->tm_conf.nb_queue_node = 0;
        pf->tm_conf.committed = false;
        pf->tm_conf.clear_on_fail = false;
 }
 
-void
-ice_tm_conf_uninit(struct rte_eth_dev *dev)
+static void free_node(struct ice_tm_node *root)
 {
-       struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-       struct ice_tm_node *tm_node;
+       uint32_t i;
 
-       /* clear node configuration */
-       while ((tm_node = TAILQ_FIRST(&pf->tm_conf.queue_list))) {
-               TAILQ_REMOVE(&pf->tm_conf.queue_list, tm_node, node);
-               rte_free(tm_node);
-       }
-       pf->tm_conf.nb_queue_node = 0;
-       while ((tm_node = TAILQ_FIRST(&pf->tm_conf.qgroup_list))) {
-               TAILQ_REMOVE(&pf->tm_conf.qgroup_list, tm_node, node);
-               rte_free(tm_node);
-       }
-       pf->tm_conf.nb_qgroup_node = 0;
-       if (pf->tm_conf.root) {
-               rte_free(pf->tm_conf.root);
-               pf->tm_conf.root = NULL;
-       }
+       if (root == NULL)
+               return;
+
+       for (i = 0; i < root->reference_count; i++)
+               free_node(root->children[i]);
+
+       rte_free(root);
 }
 
-static inline struct ice_tm_node *
-ice_tm_node_search(struct rte_eth_dev *dev,
-                   uint32_t node_id, enum ice_tm_node_type *node_type)
+void
+ice_tm_conf_uninit(struct rte_eth_dev *dev)
 {
        struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-       struct ice_tm_node_list *qgroup_list = &pf->tm_conf.qgroup_list;
-       struct ice_tm_node_list *queue_list = &pf->tm_conf.queue_list;
-       struct ice_tm_node *tm_node;
-
-       if (pf->tm_conf.root && pf->tm_conf.root->id == node_id) {
-               *node_type = ICE_TM_NODE_TYPE_PORT;
-               return pf->tm_conf.root;
-       }
 
-       TAILQ_FOREACH(tm_node, qgroup_list, node) {
-               if (tm_node->id == node_id) {
-                       *node_type = ICE_TM_NODE_TYPE_QGROUP;
-                       return tm_node;
-               }
-       }
-
-       TAILQ_FOREACH(tm_node, queue_list, node) {
-               if (tm_node->id == node_id) {
-                       *node_type = ICE_TM_NODE_TYPE_QUEUE;
-                       return tm_node;
-               }
-       }
-
-       return NULL;
+       free_node(pf->tm_conf.root);
+       pf->tm_conf.root = NULL;
 }
 
 static int
@@ -195,11 +159,29 @@ ice_node_param_check(struct ice_pf *pf, uint32_t node_id,
        return 0;
 }
 
+static struct ice_tm_node *
+find_node(struct ice_tm_node *root, uint32_t id)
+{
+       uint32_t i;
+
+       if (root == NULL || root->id == id)
+               return root;
+
+       for (i = 0; i < root->reference_count; i++) {
+               struct ice_tm_node *node = find_node(root->children[i], id);
+
+               if (node)
+                       return node;
+       }
+
+       return NULL;
+}
+
 static int
 ice_node_type_get(struct rte_eth_dev *dev, uint32_t node_id,
                   int *is_leaf, struct rte_tm_error *error)
 {
-       enum ice_tm_node_type node_type = ICE_TM_NODE_TYPE_MAX;
+       struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
        struct ice_tm_node *tm_node;
 
        if (!is_leaf || !error)
@@ -212,14 +194,14 @@ ice_node_type_get(struct rte_eth_dev *dev, uint32_t 
node_id,
        }
 
        /* check if the node id exists */
-       tm_node = ice_tm_node_search(dev, node_id, &node_type);
+       tm_node = find_node(pf->tm_conf.root, node_id);
        if (!tm_node) {
                error->type = RTE_TM_ERROR_TYPE_NODE_ID;
                error->message = "no such node";
                return -EINVAL;
        }
 
-       if (node_type == ICE_TM_NODE_TYPE_QUEUE)
+       if (tm_node->level == ICE_TM_NODE_TYPE_QUEUE)
                *is_leaf = true;
        else
                *is_leaf = false;
@@ -351,8 +333,6 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
              struct rte_tm_error *error)
 {
        struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-       enum ice_tm_node_type node_type = ICE_TM_NODE_TYPE_MAX;
-       enum ice_tm_node_type parent_node_type = ICE_TM_NODE_TYPE_MAX;
        struct ice_tm_shaper_profile *shaper_profile = NULL;
        struct ice_tm_node *tm_node;
        struct ice_tm_node *parent_node;
@@ -367,7 +347,7 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
                return ret;
 
        /* check if the node is already existed */
-       if (ice_tm_node_search(dev, node_id, &node_type)) {
+       if (find_node(pf->tm_conf.root, node_id)) {
                error->type = RTE_TM_ERROR_TYPE_NODE_ID;
                error->message = "node id already used";
                return -EINVAL;
@@ -408,6 +388,7 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
                if (!tm_node)
                        return -ENOMEM;
                tm_node->id = node_id;
+               tm_node->level = ICE_TM_NODE_TYPE_PORT;
                tm_node->parent = NULL;
                tm_node->reference_count = 0;
                tm_node->shaper_profile = shaper_profile;
@@ -420,29 +401,28 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
        }
 
        /* check the parent node */
-       parent_node = ice_tm_node_search(dev, parent_node_id,
-                                         &parent_node_type);
+       parent_node = find_node(pf->tm_conf.root, parent_node_id);
        if (!parent_node) {
                error->type = RTE_TM_ERROR_TYPE_NODE_PARENT_NODE_ID;
                error->message = "parent not exist";
                return -EINVAL;
        }
-       if (parent_node_type != ICE_TM_NODE_TYPE_PORT &&
-           parent_node_type != ICE_TM_NODE_TYPE_QGROUP) {
+       if (parent_node->level != ICE_TM_NODE_TYPE_PORT &&
+           parent_node->level != ICE_TM_NODE_TYPE_QGROUP) {
                error->type = RTE_TM_ERROR_TYPE_NODE_PARENT_NODE_ID;
                error->message = "parent is not valid";
                return -EINVAL;
        }
        /* check level */
        if (level_id != RTE_TM_NODE_LEVEL_ID_ANY &&
-           level_id != (uint32_t)parent_node_type + 1) {
+           level_id != parent_node->level + 1) {
                error->type = RTE_TM_ERROR_TYPE_NODE_PARAMS;
                error->message = "Wrong level";
                return -EINVAL;
        }
 
        /* check the node number */
-       if (parent_node_type == ICE_TM_NODE_TYPE_PORT) {
+       if (parent_node->level == ICE_TM_NODE_TYPE_PORT) {
                /* check the queue group number */
                if (parent_node->reference_count >= pf->dev_data->nb_tx_queues) 
{
                        error->type = RTE_TM_ERROR_TYPE_NODE_ID;
@@ -473,6 +453,7 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
        tm_node->weight = weight;
        tm_node->reference_count = 0;
        tm_node->parent = parent_node;
+       tm_node->level = parent_node->level + 1;
        tm_node->shaper_profile = shaper_profile;
        tm_node->children = (struct ice_tm_node **)
                        rte_calloc(NULL, 256, (sizeof(struct ice_tm_node *)), 
0);
@@ -490,15 +471,6 @@ ice_tm_node_add(struct rte_eth_dev *dev, uint32_t node_id,
 
        rte_memcpy(&tm_node->params, params,
                         sizeof(struct rte_tm_node_params));
-       if (parent_node_type == ICE_TM_NODE_TYPE_PORT) {
-               TAILQ_INSERT_TAIL(&pf->tm_conf.qgroup_list,
-                                 tm_node, node);
-               pf->tm_conf.nb_qgroup_node++;
-       } else {
-               TAILQ_INSERT_TAIL(&pf->tm_conf.queue_list,
-                                 tm_node, node);
-               pf->tm_conf.nb_queue_node++;
-       }
        tm_node->parent->reference_count++;
 
        return 0;
@@ -509,7 +481,6 @@ ice_tm_node_delete(struct rte_eth_dev *dev, uint32_t 
node_id,
                 struct rte_tm_error *error)
 {
        struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
-       enum ice_tm_node_type node_type = ICE_TM_NODE_TYPE_MAX;
        struct ice_tm_node *tm_node;
 
        if (!error)
@@ -522,7 +493,7 @@ ice_tm_node_delete(struct rte_eth_dev *dev, uint32_t 
node_id,
        }
 
        /* check if the node id exists */
-       tm_node = ice_tm_node_search(dev, node_id, &node_type);
+       tm_node = find_node(pf->tm_conf.root, node_id);
        if (!tm_node) {
                error->type = RTE_TM_ERROR_TYPE_NODE_ID;
                error->message = "no such node";
@@ -538,7 +509,7 @@ ice_tm_node_delete(struct rte_eth_dev *dev, uint32_t 
node_id,
        }
 
        /* root node */
-       if (node_type == ICE_TM_NODE_TYPE_PORT) {
+       if (tm_node->level == ICE_TM_NODE_TYPE_PORT) {
                rte_free(tm_node);
                pf->tm_conf.root = NULL;
                return 0;
@@ -546,13 +517,6 @@ ice_tm_node_delete(struct rte_eth_dev *dev, uint32_t 
node_id,
 
        /* queue group or queue node */
        tm_node->parent->reference_count--;
-       if (node_type == ICE_TM_NODE_TYPE_QGROUP) {
-               TAILQ_REMOVE(&pf->tm_conf.qgroup_list, tm_node, node);
-               pf->tm_conf.nb_qgroup_node--;
-       } else {
-               TAILQ_REMOVE(&pf->tm_conf.queue_list, tm_node, node);
-               pf->tm_conf.nb_queue_node--;
-       }
        rte_free(tm_node);
 
        return 0;
@@ -708,9 +672,9 @@ static int ice_reset_noleaf_nodes(struct rte_eth_dev *dev)
 {
        struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
        struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ice_tm_node_list *qgroup_list = &pf->tm_conf.qgroup_list;
        struct ice_sched_node *vsi_node = ice_get_vsi_node(hw);
-       struct ice_tm_node *tm_node;
+       struct ice_tm_node *root = pf->tm_conf.root;
+       uint32_t i;
        int ret;
 
        /* reset vsi_node */
@@ -720,8 +684,12 @@ static int ice_reset_noleaf_nodes(struct rte_eth_dev *dev)
                return ret;
        }
 
-       /* reset queue group nodes */
-       TAILQ_FOREACH(tm_node, qgroup_list, node) {
+       if (root == NULL)
+               return 0;
+
+       for (i = 0; i < root->reference_count; i++) {
+               struct ice_tm_node *tm_node = root->children[i];
+
                if (tm_node->sched_node == NULL)
                        continue;
 
@@ -774,9 +742,7 @@ int ice_do_hierarchy_commit(struct rte_eth_dev *dev,
 {
        struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
        struct ice_hw *hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       struct ice_tm_node_list *qgroup_list = &pf->tm_conf.qgroup_list;
-       struct ice_tm_node_list *queue_list = &pf->tm_conf.queue_list;
-       struct ice_tm_node *tm_node;
+       struct ice_tm_node *root;
        struct ice_sched_node *vsi_node = NULL;
        struct ice_sched_node *queue_node;
        struct ice_tx_queue *txq;
@@ -807,14 +773,14 @@ int ice_do_hierarchy_commit(struct rte_eth_dev *dev,
 
        /* config vsi node */
        vsi_node = ice_get_vsi_node(hw);
-       tm_node = pf->tm_conf.root;
+       root = pf->tm_conf.root;
 
-       ret_val = ice_set_node_rate(hw, tm_node, vsi_node);
+       ret_val = ice_set_node_rate(hw, root, vsi_node);
        if (ret_val) {
                error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED;
                PMD_DRV_LOG(ERR,
                            "configure vsi node %u bandwidth failed",
-                           tm_node->id);
+                           root->id);
                goto add_leaf;
        }
 
@@ -825,13 +791,27 @@ int ice_do_hierarchy_commit(struct rte_eth_dev *dev,
        idx_vsi_child = 0;
        idx_qg = 0;
 
-       TAILQ_FOREACH(tm_node, qgroup_list, node) {
+       if (root == NULL)
+               goto commit;
+
+       for (i = 0; i < root->reference_count; i++) {
+               struct ice_tm_node *tm_node = root->children[i];
                struct ice_tm_node *tm_child_node;
                struct ice_sched_node *qgroup_sched_node =
                        vsi_node->children[idx_vsi_child]->children[idx_qg];
+               uint32_t j;
 
-               for (i = 0; i < tm_node->reference_count; i++) {
-                       tm_child_node = tm_node->children[i];
+               ret_val = ice_cfg_hw_node(hw, tm_node, qgroup_sched_node);
+               if (ret_val) {
+                       error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED;
+                       PMD_DRV_LOG(ERR,
+                                   "configure queue group node %u failed",
+                                   tm_node->id);
+                       goto reset_leaf;
+               }
+
+               for (j = 0; j < tm_node->reference_count; j++) {
+                       tm_child_node = tm_node->children[j];
                        qid = tm_child_node->id;
                        ret_val = ice_tx_queue_start(dev, qid);
                        if (ret_val) {
@@ -847,25 +827,25 @@ int ice_do_hierarchy_commit(struct rte_eth_dev *dev,
                                PMD_DRV_LOG(ERR, "get queue %u node failed", 
qid);
                                goto reset_leaf;
                        }
-                       if (queue_node->info.parent_teid == 
qgroup_sched_node->info.node_teid)
-                               continue;
-                       ret_val = ice_move_recfg_lan_txq(dev, queue_node, 
qgroup_sched_node, qid);
+                       if (queue_node->info.parent_teid != 
qgroup_sched_node->info.node_teid) {
+                               ret_val = ice_move_recfg_lan_txq(dev, 
queue_node,
+                                                                
qgroup_sched_node, qid);
+                               if (ret_val) {
+                                       error->type = 
RTE_TM_ERROR_TYPE_UNSPECIFIED;
+                                       PMD_DRV_LOG(ERR, "move queue %u 
failed", qid);
+                                       goto reset_leaf;
+                               }
+                       }
+                       ret_val = ice_cfg_hw_node(hw, tm_child_node, 
queue_node);
                        if (ret_val) {
                                error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED;
-                               PMD_DRV_LOG(ERR, "move queue %u failed", qid);
+                               PMD_DRV_LOG(ERR,
+                                           "configure queue group node %u 
failed",
+                                           tm_node->id);
                                goto reset_leaf;
                        }
                }
 
-               ret_val = ice_cfg_hw_node(hw, tm_node, qgroup_sched_node);
-               if (ret_val) {
-                       error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED;
-                       PMD_DRV_LOG(ERR,
-                                   "configure queue group node %u failed",
-                                   tm_node->id);
-                       goto reset_leaf;
-               }
-
                idx_qg++;
                if (idx_qg >= nb_qg) {
                        idx_qg = 0;
@@ -878,23 +858,7 @@ int ice_do_hierarchy_commit(struct rte_eth_dev *dev,
                }
        }
 
-       /* config queue nodes */
-       TAILQ_FOREACH(tm_node, queue_list, node) {
-               qid = tm_node->id;
-               txq = dev->data->tx_queues[qid];
-               q_teid = txq->q_teid;
-               queue_node = ice_sched_get_node(hw->port_info, q_teid);
-
-               ret_val = ice_cfg_hw_node(hw, tm_node, queue_node);
-               if (ret_val) {
-                       error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED;
-                       PMD_DRV_LOG(ERR,
-                                   "configure queue group node %u failed",
-                                   tm_node->id);
-                       goto reset_leaf;
-               }
-       }
-
+commit:
        pf->tm_conf.committed = true;
        pf->tm_conf.clear_on_fail = clear_on_fail;
 
-- 
2.31.1

Reply via email to