net/i40e: fix not supporting NULL TM profile
It's by design that APP can add a TM node without shaper profile. But i40e doesn't support it currently. Fixes:03a249b62b
("net/i40e: support adding TM node") Fixes:cac29c3c00
("net/i40e: support committing TM hierarchy") Cc: stable@dpdk.org Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com> Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
This commit is contained in:
parent
7039bcacb9
commit
70039fe684
@ -480,7 +480,7 @@ i40e_node_add(struct rte_eth_dev *dev, uint32_t node_id,
|
||||
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
|
||||
enum i40e_tm_node_type node_type = I40E_TM_NODE_TYPE_MAX;
|
||||
enum i40e_tm_node_type parent_node_type = I40E_TM_NODE_TYPE_MAX;
|
||||
struct i40e_tm_shaper_profile *shaper_profile;
|
||||
struct i40e_tm_shaper_profile *shaper_profile = NULL;
|
||||
struct i40e_tm_node *tm_node;
|
||||
struct i40e_tm_node *parent_node;
|
||||
uint16_t tc_nb = 0;
|
||||
@ -509,12 +509,15 @@ i40e_node_add(struct rte_eth_dev *dev, uint32_t node_id,
|
||||
}
|
||||
|
||||
/* check the shaper profile id */
|
||||
shaper_profile = i40e_shaper_profile_search(dev,
|
||||
params->shaper_profile_id);
|
||||
if (!shaper_profile) {
|
||||
error->type = RTE_TM_ERROR_TYPE_NODE_PARAMS_SHAPER_PROFILE_ID;
|
||||
error->message = "shaper profile not exist";
|
||||
return -EINVAL;
|
||||
if (params->shaper_profile_id != RTE_TM_SHAPER_PROFILE_ID_NONE) {
|
||||
shaper_profile = i40e_shaper_profile_search(
|
||||
dev, params->shaper_profile_id);
|
||||
if (!shaper_profile) {
|
||||
error->type =
|
||||
RTE_TM_ERROR_TYPE_NODE_PARAMS_SHAPER_PROFILE_ID;
|
||||
error->message = "shaper profile not exist";
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/* root node if not have a parent */
|
||||
@ -551,7 +554,8 @@ i40e_node_add(struct rte_eth_dev *dev, uint32_t node_id,
|
||||
pf->tm_conf.root = tm_node;
|
||||
|
||||
/* increase the reference counter of the shaper profile */
|
||||
shaper_profile->reference_count++;
|
||||
if (shaper_profile)
|
||||
shaper_profile->reference_count++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -633,7 +637,8 @@ i40e_node_add(struct rte_eth_dev *dev, uint32_t node_id,
|
||||
tm_node->parent->reference_count++;
|
||||
|
||||
/* increase the reference counter of the shaper profile */
|
||||
shaper_profile->reference_count++;
|
||||
if (shaper_profile)
|
||||
shaper_profile->reference_count++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -680,14 +685,16 @@ i40e_node_delete(struct rte_eth_dev *dev, uint32_t node_id,
|
||||
|
||||
/* root node */
|
||||
if (node_type == I40E_TM_NODE_TYPE_PORT) {
|
||||
tm_node->shaper_profile->reference_count--;
|
||||
if (tm_node->shaper_profile)
|
||||
tm_node->shaper_profile->reference_count--;
|
||||
rte_free(tm_node);
|
||||
pf->tm_conf.root = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TC or queue node */
|
||||
tm_node->shaper_profile->reference_count--;
|
||||
if (tm_node->shaper_profile)
|
||||
tm_node->shaper_profile->reference_count--;
|
||||
tm_node->parent->reference_count--;
|
||||
if (node_type == I40E_TM_NODE_TYPE_TC) {
|
||||
TAILQ_REMOVE(&pf->tm_conf.tc_list, tm_node, node);
|
||||
@ -895,11 +902,15 @@ i40e_hierarchy_commit(struct rte_eth_dev *dev,
|
||||
* If the port has a max bandwidth, the TCs should have none.
|
||||
*/
|
||||
/* port */
|
||||
bw = pf->tm_conf.root->shaper_profile->profile.peak.rate;
|
||||
if (pf->tm_conf.root->shaper_profile)
|
||||
bw = pf->tm_conf.root->shaper_profile->profile.peak.rate;
|
||||
else
|
||||
bw = 0;
|
||||
if (bw) {
|
||||
/* check if any TC has a max bandwidth */
|
||||
TAILQ_FOREACH(tm_node, tc_list, node) {
|
||||
if (tm_node->shaper_profile->profile.peak.rate) {
|
||||
if (tm_node->shaper_profile &&
|
||||
tm_node->shaper_profile->profile.peak.rate) {
|
||||
error->type = RTE_TM_ERROR_TYPE_SHAPER_PROFILE;
|
||||
error->message = "no port and TC max bandwidth"
|
||||
" in parallel";
|
||||
@ -943,7 +954,10 @@ i40e_hierarchy_commit(struct rte_eth_dev *dev,
|
||||
}
|
||||
tc_map &= ~BIT_ULL(i);
|
||||
|
||||
bw = tm_node->shaper_profile->profile.peak.rate;
|
||||
if (tm_node->shaper_profile)
|
||||
bw = tm_node->shaper_profile->profile.peak.rate;
|
||||
else
|
||||
bw = 0;
|
||||
if (!bw)
|
||||
continue;
|
||||
|
||||
@ -954,7 +968,10 @@ i40e_hierarchy_commit(struct rte_eth_dev *dev,
|
||||
}
|
||||
|
||||
TAILQ_FOREACH(tm_node, queue_list, node) {
|
||||
bw = tm_node->shaper_profile->profile.peak.rate;
|
||||
if (tm_node->shaper_profile)
|
||||
bw = tm_node->shaper_profile->profile.peak.rate;
|
||||
else
|
||||
bw = 0;
|
||||
if (bw) {
|
||||
error->type = RTE_TM_ERROR_TYPE_NODE_PARAMS;
|
||||
error->message = "not support queue QoS";
|
||||
|
Loading…
Reference in New Issue
Block a user