From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0B51D437FC; Tue, 2 Jan 2024 12:22:06 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CBAF040A77; Tue, 2 Jan 2024 12:21:41 +0100 (CET) Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.10]) by mails.dpdk.org (Postfix) with ESMTP id 2649E406BA for ; Tue, 2 Jan 2024 12:21:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1704194499; x=1735730499; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=tMkaXHy/Mrc/nNlWCyGJTeu9zmYtwWlE09IqbpEcurk=; b=mZ/h5O4Oaut4oojuqKnzE4M8YlaU/Z+LqN1eZFJ6fk62u4FtZNyOqotu 1KWwflzww51My/U24ScmAatMUXKEifXP33MVpZ5oXRmqMHguFvx+DQxv0 1tcfRbPViGGA2dDLFTZNLyQ/ZygTzhidIE/rx1a2SLxHJPM5orVTjM5kl 0v5XomRAiFjDtN7MdgTayy0UhmPiYe5JVleEMH2coQx1xATezBzPnbDVF KyRTyOtelprFd7h78SbpZTirSCj1084Ndysh7iXfw8GbUWsc/spEIVJVs vrS1FY9esZ7Qd2c/RohXyuREnyKRqY966TJylqWD3G6btRrKOM3q9zVCx Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10940"; a="10256799" X-IronPort-AV: E=Sophos;i="6.04,324,1695711600"; d="scan'208";a="10256799" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Jan 2024 03:21:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10940"; a="952895253" X-IronPort-AV: E=Sophos;i="6.04,324,1695711600"; d="scan'208";a="952895253" Received: from dpdk-qzhan15-test02.sh.intel.com ([10.67.115.37]) by orsmga005.jf.intel.com with ESMTP; 02 Jan 2024 03:21:37 -0800 From: Qi Zhang To: qiming.yang@intel.com, wenjun1.wu@intel.com Cc: dev@dpdk.org, Qi Zhang Subject: [PATCH 5/6] net/ice: reset Tx sched node during commit Date: Tue, 2 Jan 2024 14:42:31 -0500 Message-Id: <20240102194232.3614305-6-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240102194232.3614305-1-qi.z.zhang@intel.com> References: <20240102194232.3614305-1-qi.z.zhang@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 1. Always reset all Tx scheduler at the beginning of a commit action. This prevent unexpected remains from previous commit. 2. Reset all Tx scheduler nodes if a commit failed. For leaf node, stop queues which will remove sched node from scheduler tree, then start queues which will add sched node back to default topo. For noleaf node, simply reset to default parameters. Signed-off-by: Qi Zhang --- drivers/net/ice/ice_ethdev.h | 1 + drivers/net/ice/ice_tm.c | 130 ++++++++++++++++++++++++++++------- 2 files changed, 107 insertions(+), 24 deletions(-) diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h index 1338c80d14..3b2db6aaa6 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -478,6 +478,7 @@ struct ice_tm_node { struct ice_tm_node **children; struct ice_tm_shaper_profile *shaper_profile; struct rte_tm_node_params params; + struct ice_sched_node *sched_node; }; /* node type of Traffic Manager */ diff --git a/drivers/net/ice/ice_tm.c b/drivers/net/ice/ice_tm.c index 20cc47fff1..4d8dbff2dc 100644 --- a/drivers/net/ice/ice_tm.c +++ b/drivers/net/ice/ice_tm.c @@ -756,16 +756,91 @@ static int ice_cfg_hw_node(struct ice_hw *hw, return 0; } +static struct ice_sched_node *ice_get_vsi_node(struct ice_hw *hw) +{ + struct ice_sched_node *node = hw->port_info->root; + uint32_t vsi_layer = hw->num_tx_sched_layers - ICE_VSI_LAYER_OFFSET; + uint32_t i; + + for (i = 0; i < vsi_layer; i++) + node = node->children[0]; + + return node; +} + +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; + int ret; + + /* reset vsi_node */ + ret = ice_set_node_rate(hw, NULL, vsi_node); + if (ret) { + PMD_DRV_LOG(ERR, "reset vsi node failed"); + return ret; + } + + /* reset queue group nodes */ + TAILQ_FOREACH(tm_node, qgroup_list, node) { + if (tm_node->sched_node == NULL) + continue; + + ret = ice_cfg_hw_node(hw, NULL, tm_node->sched_node); + if (ret) { + PMD_DRV_LOG(ERR, "reset queue group node %u failed", tm_node->id); + return ret; + } + tm_node->sched_node = NULL; + } + + return 0; +} + +static int ice_remove_leaf_nodes(struct rte_eth_dev *dev) +{ + int ret = 0; + int i; + + for (i = 0; i < dev->data->nb_tx_queues; i++) { + ret = ice_tx_queue_stop(dev, i); + if (ret) { + PMD_DRV_LOG(ERR, "stop queue %u failed", i); + break; + } + } + + return ret; +} + +static int ice_add_leaf_nodes(struct rte_eth_dev *dev) +{ + int ret = 0; + int i; + + for (i = 0; i < dev->data->nb_tx_queues; i++) { + ret = ice_tx_queue_start(dev, i); + if (ret) { + PMD_DRV_LOG(ERR, "start queue %u failed", i); + break; + } + } + + return ret; +} + static int ice_hierarchy_commit(struct rte_eth_dev *dev, int clear_on_fail, - __rte_unused struct rte_tm_error *error) + struct rte_tm_error *error) { 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_sched_node *node; struct ice_sched_node *vsi_node = NULL; struct ice_sched_node *queue_node; struct ice_tx_queue *txq; @@ -777,23 +852,25 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, uint32_t nb_qg; uint32_t qid; uint32_t q_teid; - uint32_t vsi_layer; - for (i = 0; i < dev->data->nb_tx_queues; i++) { - ret_val = ice_tx_queue_stop(dev, i); - if (ret_val) { - error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED; - PMD_DRV_LOG(ERR, "stop queue %u failed", i); - goto fail_clear; - } + /* remove leaf nodes */ + ret_val = ice_remove_leaf_nodes(dev); + if (ret_val) { + error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED; + PMD_DRV_LOG(ERR, "reset no-leaf nodes failed"); + goto fail_clear; } - node = hw->port_info->root; - vsi_layer = hw->num_tx_sched_layers - ICE_VSI_LAYER_OFFSET; - for (i = 0; i < vsi_layer; i++) - node = node->children[0]; - vsi_node = node; + /* reset no-leaf nodes. */ + ret_val = ice_reset_noleaf_nodes(dev); + if (ret_val) { + error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED; + PMD_DRV_LOG(ERR, "reset leaf nodes failed"); + goto add_leaf; + } + /* config vsi node */ + vsi_node = ice_get_vsi_node(hw); tm_node = TAILQ_FIRST(&pf->tm_conf.vsi_list); ret_val = ice_set_node_rate(hw, tm_node, vsi_node); @@ -802,9 +879,10 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, PMD_DRV_LOG(ERR, "configure vsi node %u bandwidth failed", tm_node->id); - goto reset_vsi; + goto add_leaf; } + /* config queue group nodes */ nb_vsi_child = vsi_node->num_children; nb_qg = vsi_node->children[0]->num_children; @@ -823,7 +901,7 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, if (ret_val) { error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED; PMD_DRV_LOG(ERR, "start queue %u failed", qid); - goto reset_vsi; + goto reset_leaf; } txq = dev->data->tx_queues[qid]; q_teid = txq->q_teid; @@ -831,7 +909,7 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, if (queue_node == NULL) { error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED; PMD_DRV_LOG(ERR, "get queue %u node failed", qid); - goto reset_vsi; + goto reset_leaf; } if (queue_node->info.parent_teid == qgroup_sched_node->info.node_teid) continue; @@ -839,7 +917,7 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, if (ret_val) { error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED; PMD_DRV_LOG(ERR, "move queue %u failed", qid); - goto reset_vsi; + goto reset_leaf; } } @@ -849,7 +927,7 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, PMD_DRV_LOG(ERR, "configure queue group node %u failed", tm_node->id); - goto reset_vsi; + goto reset_leaf; } idx_qg++; @@ -860,10 +938,11 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, if (idx_vsi_child >= nb_vsi_child) { error->type = RTE_TM_ERROR_TYPE_UNSPECIFIED; PMD_DRV_LOG(ERR, "too many queues"); - goto reset_vsi; + goto reset_leaf; } } + /* config queue nodes */ TAILQ_FOREACH(tm_node, queue_list, node) { qid = tm_node->id; txq = dev->data->tx_queues[qid]; @@ -876,14 +955,17 @@ static int ice_hierarchy_commit(struct rte_eth_dev *dev, PMD_DRV_LOG(ERR, "configure queue group node %u failed", tm_node->id); - goto reset_vsi; + goto reset_leaf; } } return ret_val; -reset_vsi: - ice_set_node_rate(hw, NULL, vsi_node); +reset_leaf: + ice_remove_leaf_nodes(dev); +add_leaf: + ice_add_leaf_nodes(dev); + ice_reset_noleaf_nodes(dev); fail_clear: /* clear all the traffic manager configuration */ if (clear_on_fail) { -- 2.31.1