@@ -15365,19 +15365,18 @@ __flow_dv_create_policy_flow(struct rte_eth_dev *dev,
if (!is_default_policy && (priv->representor || priv->master)) {
if (flow_dv_translate_item_port_id(dev, matcher.buf,
value.buf, NULL, attr)) {
- DRV_LOG(ERR,
- "Failed to create meter policy flow with port.");
+ DRV_LOG(ERR, "Failed to create meter policy%d flow's"
+ " value with port.", color);
return -1;
}
}
flow_dv_match_meta_reg(matcher.buf, value.buf,
- (enum modify_reg)color_reg_c_idx,
- rte_col_2_mlx5_col(color),
- UINT32_MAX);
- ret = mlx5_flow_os_create_flow(matcher_object,
- (void *)&value, actions_n, actions, rule);
+ (enum modify_reg)color_reg_c_idx,
+ rte_col_2_mlx5_col(color), UINT32_MAX);
+ ret = mlx5_flow_os_create_flow(matcher_object, (void *)&value,
+ actions_n, actions, rule);
if (ret) {
- DRV_LOG(ERR, "Failed to create meter policy flow.");
+ DRV_LOG(ERR, "Failed to create meter policy%d flow.", color);
return -1;
}
return 0;
@@ -15416,8 +15415,8 @@ __flow_dv_create_policy_matcher(struct rte_eth_dev *dev,
if (!is_default_policy && (priv->representor || priv->master)) {
if (flow_dv_translate_item_port_id(dev, matcher.mask.buf,
value.buf, NULL, attr)) {
- DRV_LOG(ERR,
- "Failed to register meter drop matcher with port.");
+ DRV_LOG(ERR, "Failed to register meter policy%d matcher"
+ " with port.", priority);
return -1;
}
}
@@ -15425,9 +15424,11 @@ __flow_dv_create_policy_matcher(struct rte_eth_dev *dev,
if (priority < RTE_COLOR_RED)
flow_dv_match_meta_reg(matcher.mask.buf, value.buf,
(enum modify_reg)color_reg_c_idx, 0, color_mask);
- matcher.priority = priority;
+ /* Adjust the priority */
+ matcher.priority = (priority == RTE_COLOR_YELLOW) ?
+ RTE_COLOR_GREEN : priority;
matcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,
- matcher.mask.size);
+ matcher.mask.size);
entry = mlx5_cache_register(&tbl_data->matchers, &ctx);
if (!entry) {
DRV_LOG(ERR, "Failed to register meter drop matcher.");
@@ -15490,15 +15491,18 @@ __flow_dv_create_domain_policy_rules(struct rte_eth_dev *dev,
/* Prepare matchers. */
color_reg_c_idx = ret;
for (i = 0; i < RTE_COLORS; i++) {
- if (i == RTE_COLOR_YELLOW || !acts[i].actions_n)
+ if (!acts[i].actions_n)
continue;
attr.priority = i;
if (!sub_policy->color_matcher[i]) {
/* Create matchers for Color. */
if (__flow_dv_create_policy_matcher(dev,
color_reg_c_idx, i, sub_policy,
- &attr, is_default_policy, &flow_err))
+ &attr, is_default_policy, &flow_err)) {
+ DRV_LOG(ERR,
+ "Failed to create color%u matcher.", i);
return -1;
+ }
}
/* Create flow, matching color. */
if (acts[i].actions_n)
@@ -15509,8 +15513,11 @@ __flow_dv_create_domain_policy_rules(struct rte_eth_dev *dev,
acts[i].dv_actions,
is_default_policy,
&sub_policy->color_rule[i],
- &attr))
+ &attr)) {
+ DRV_LOG(ERR,
+ "Failed to create color%u rule.", i);
return -1;
+ }
}
return 0;
}
@@ -15665,8 +15672,7 @@ __flow_dv_create_domain_def_policy(struct rte_eth_dev *dev, uint32_t domain)
sizeof(struct mlx5_flow_meter_def_policy),
RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
if (!def_policy) {
- DRV_LOG(ERR, "Failed to alloc "
- "default policy table.");
+ DRV_LOG(ERR, "Failed to alloc default policy table.");
goto def_policy_error;
}
mtrmng->def_policy[domain] = def_policy;
@@ -15682,26 +15688,46 @@ __flow_dv_create_domain_def_policy(struct rte_eth_dev *dev, uint32_t domain)
}
def_policy->sub_policy.jump_tbl[RTE_COLOR_GREEN] = jump_tbl;
tbl_data = container_of(jump_tbl,
- struct mlx5_flow_tbl_data_entry, tbl);
+ struct mlx5_flow_tbl_data_entry, tbl);
def_policy->dr_jump_action[RTE_COLOR_GREEN] =
tbl_data->jump.action;
- acts[RTE_COLOR_GREEN].dv_actions[0] =
- tbl_data->jump.action;
+ acts[RTE_COLOR_GREEN].dv_actions[0] = tbl_data->jump.action;
acts[RTE_COLOR_GREEN].actions_n = 1;
+ /*
+ * YELLOW has the same default policy as GREEN does.
+ * G & Y share the same table and action.
+ */
+ jump_tbl = flow_dv_tbl_resource_get(dev,
+ MLX5_FLOW_TABLE_LEVEL_METER,
+ egress, transfer, false, NULL, 0,
+ 0, MLX5_MTR_TABLE_ID_SUFFIX, &error);
+ if (!jump_tbl) {
+ DRV_LOG(ERR,
+ "Failed to get meter suffix table.");
+ goto def_policy_error;
+ }
+ def_policy->sub_policy.jump_tbl[RTE_COLOR_YELLOW] = jump_tbl;
+ tbl_data = container_of(jump_tbl,
+ struct mlx5_flow_tbl_data_entry, tbl);
+ def_policy->dr_jump_action[RTE_COLOR_YELLOW] =
+ tbl_data->jump.action;
+ acts[RTE_COLOR_YELLOW].dv_actions[0] = tbl_data->jump.action;
+ acts[RTE_COLOR_YELLOW].actions_n = 1;
/* Create jump action to the drop table. */
if (!mtrmng->drop_tbl[domain]) {
mtrmng->drop_tbl[domain] = flow_dv_tbl_resource_get
(dev, MLX5_FLOW_TABLE_LEVEL_METER,
- egress, transfer, false, NULL, 0,
- 0, MLX5_MTR_TABLE_ID_DROP, &error);
+ egress, transfer, false, NULL, 0,
+ 0, MLX5_MTR_TABLE_ID_DROP, &error);
if (!mtrmng->drop_tbl[domain]) {
- DRV_LOG(ERR, "Failed to create "
- "meter drop table for default policy.");
+ DRV_LOG(ERR, "Failed to create meter "
+ "drop table for default policy.");
goto def_policy_error;
}
}
+ /* all RED: unique Drop table for jump action. */
tbl_data = container_of(mtrmng->drop_tbl[domain],
- struct mlx5_flow_tbl_data_entry, tbl);
+ struct mlx5_flow_tbl_data_entry, tbl);
def_policy->dr_jump_action[RTE_COLOR_RED] =
tbl_data->jump.action;
acts[RTE_COLOR_RED].dv_actions[0] = tbl_data->jump.action;
@@ -15711,15 +15737,14 @@ __flow_dv_create_domain_def_policy(struct rte_eth_dev *dev, uint32_t domain)
&def_policy->sub_policy,
egress, transfer, true, acts);
if (ret) {
- DRV_LOG(ERR, "Failed to create "
- "default policy rules.");
- goto def_policy_error;
+ DRV_LOG(ERR, "Failed to create default policy rules.");
+ goto def_policy_error;
}
}
return 0;
def_policy_error:
__flow_dv_destroy_domain_def_policy(dev,
- (enum mlx5_meter_domain)domain);
+ (enum mlx5_meter_domain)domain);
return -1;
}
@@ -15742,8 +15767,9 @@ flow_dv_create_def_policy(struct rte_eth_dev *dev)
if (!priv->config.dv_esw_en && i == MLX5_MTR_DOMAIN_TRANSFER)
continue;
if (__flow_dv_create_domain_def_policy(dev, i)) {
- DRV_LOG(ERR,
- "Failed to create default policy");
+ DRV_LOG(ERR, "Failed to create default policy");
+ /* Rollback the created default policies for others. */
+ flow_dv_destroy_def_policy(dev);
return -1;
}
}