[dpdk-dev] [PATCH v2] net/ice: fix error check for QoS in DCF

Ting Xu ting.xu at intel.com
Thu Jul 8 04:32:25 CEST 2021


This patch fixed some unreasonable error check. Move all checks into one
helper function before configuring. Skip the check for DCF (VF0).

Fixes: 3a5a5bfc618b ("net/ice: support QoS config VF bandwidth in DCF")
Cc: stable at dpdk.org

Signed-off-by: Ting Xu <ting.xu at intel.com>

---
v1->v2: rebase
---
 drivers/net/ice/ice_dcf_sched.c | 65 ++++++++++++++++++++++-----------
 1 file changed, 44 insertions(+), 21 deletions(-)

diff --git a/drivers/net/ice/ice_dcf_sched.c b/drivers/net/ice/ice_dcf_sched.c
index aeb1afbe85..8a0529a3bc 100644
--- a/drivers/net/ice/ice_dcf_sched.c
+++ b/drivers/net/ice/ice_dcf_sched.c
@@ -631,6 +631,43 @@ ice_dcf_validate_tc_bw(struct virtchnl_dcf_bw_cfg_list *tc_bw,
 
 	return 0;
 }
+
+static int ice_dcf_commit_check(struct ice_dcf_hw *hw)
+{
+	struct ice_dcf_tm_node_list *tc_list = &hw->tm_conf.tc_list;
+	struct ice_dcf_tm_node_list *vsi_list = &hw->tm_conf.vsi_list;
+	struct ice_dcf_tm_node *tm_node;
+
+	if (!(hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_QOS)) {
+		PMD_DRV_LOG(ERR, "Configure VF bandwidth is not supported");
+		return ICE_ERR_NOT_SUPPORTED;
+	}
+
+	/* check if all TC nodes are set */
+	if (BIT(hw->tm_conf.nb_tc_node) & hw->ets_config->tc_valid_bits) {
+		PMD_DRV_LOG(ERR, "Not all enabled TC nodes are set");
+		return ICE_ERR_PARAM;
+	}
+
+	/* check if all VF vsi nodes are binded to all TCs */
+	TAILQ_FOREACH(tm_node, tc_list, node) {
+		if (tm_node->reference_count != hw->num_vfs) {
+			PMD_DRV_LOG(ERR, "Not all VFs are binded to TC%u",
+					tm_node->tc);
+			return ICE_ERR_PARAM;
+		}
+	}
+
+	/* check if VF vsi node id start with 0 */
+	tm_node = TAILQ_FIRST(vsi_list);
+	if (tm_node->id != 0) {
+		PMD_DRV_LOG(ERR, "VF vsi node id must start with 0");
+		return ICE_ERR_PARAM;
+	}
+
+	return ICE_SUCCESS;
+}
+
 static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev,
 				 int clear_on_fail,
 				 __rte_unused struct rte_tm_error *error)
@@ -645,20 +682,11 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev,
 	uint32_t port_bw, cir_total;
 	uint16_t size, vf_id;
 	uint8_t num_elem = 0;
-	int i, ret_val = ICE_SUCCESS;
-
-	if (!(hw->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_QOS)) {
-		PMD_DRV_LOG(ERR, "Configure VF bandwidth is not supported");
-		ret_val = ICE_ERR_NOT_SUPPORTED;
-		goto fail_clear;
-	}
+	int i, ret_val;
 
-	/* check if all TC nodes are set */
-	if (BIT(hw->tm_conf.nb_tc_node) & hw->ets_config->tc_valid_bits) {
-		PMD_DRV_LOG(ERR, "Not all enabled TC nodes are set");
-		ret_val = ICE_ERR_PARAM;
+	ret_val = ice_dcf_commit_check(hw);
+	if (ret_val)
 		goto fail_clear;
-	}
 
 	size = sizeof(struct virtchnl_dcf_bw_cfg_list) +
 		sizeof(struct virtchnl_dcf_bw_cfg) *
@@ -690,7 +718,10 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev,
 			VIRTCHNL_DCF_BW_PIR | VIRTCHNL_DCF_BW_CIR;
 	}
 
-	for (vf_id = 0; vf_id < hw->num_vfs; vf_id++) {
+	/* start with VF1, skip VF0 since DCF does not need to configure
+	 * bandwidth for itself
+	 */
+	for (vf_id = 1; vf_id < hw->num_vfs; vf_id++) {
 		num_elem = 0;
 		vf_bw->vf_id = vf_id;
 		vf_bw->node_type = VIRTCHNL_DCF_TARGET_VF_BW;
@@ -722,14 +753,6 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev,
 			num_elem++;
 		}
 
-		/* check if all TC nodes are set with VF vsi nodes */
-		if (num_elem != hw->tm_conf.nb_tc_node) {
-			PMD_DRV_LOG(ERR, "VF%u vsi nodes are not set to all TC nodes, node id should be continuous",
-				    vf_id);
-			ret_val = ICE_ERR_PARAM;
-			goto fail_clear;
-		}
-
 		vf_bw->num_elem = num_elem;
 		ret_val = ice_dcf_set_vf_bw(hw, vf_bw, size);
 		if (ret_val)
-- 
2.17.1



More information about the dev mailing list