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:
Wenzhuo Lu 2017-10-17 13:50:38 +08:00 committed by Ferruh Yigit
parent 7039bcacb9
commit 70039fe684

View File

@ -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";