net/mlx5: Embed mlx5_flow_act into fs_fte
fte objects contain the match value and action. Currently, extending the actions require in adding them both to the API and fs_fte. Signed-off-by: Matan Barak <matanb@mellanox.com> Signed-off-by: Aviad Yehezkel <aviadye@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
5f4183781a
commit
d2ec6a35e8
|
@ -163,9 +163,9 @@ TRACE_EVENT(mlx5_fs_set_fte,
|
||||||
fs_get_obj(__entry->fg, fte->node.parent);
|
fs_get_obj(__entry->fg, fte->node.parent);
|
||||||
__entry->group_index = __entry->fg->id;
|
__entry->group_index = __entry->fg->id;
|
||||||
__entry->index = fte->index;
|
__entry->index = fte->index;
|
||||||
__entry->action = fte->action;
|
__entry->action = fte->action.action;
|
||||||
__entry->mask_enable = __entry->fg->mask.match_criteria_enable;
|
__entry->mask_enable = __entry->fg->mask.match_criteria_enable;
|
||||||
__entry->flow_tag = fte->flow_tag;
|
__entry->flow_tag = fte->action.flow_tag;
|
||||||
memcpy(__entry->mask_outer,
|
memcpy(__entry->mask_outer,
|
||||||
MLX5_ADDR_OF(fte_match_param,
|
MLX5_ADDR_OF(fte_match_param,
|
||||||
&__entry->fg->mask.match_criteria,
|
&__entry->fg->mask.match_criteria,
|
||||||
|
|
|
@ -340,16 +340,17 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
|
||||||
|
|
||||||
in_flow_context = MLX5_ADDR_OF(set_fte_in, in, flow_context);
|
in_flow_context = MLX5_ADDR_OF(set_fte_in, in, flow_context);
|
||||||
MLX5_SET(flow_context, in_flow_context, group_id, group_id);
|
MLX5_SET(flow_context, in_flow_context, group_id, group_id);
|
||||||
MLX5_SET(flow_context, in_flow_context, flow_tag, fte->flow_tag);
|
MLX5_SET(flow_context, in_flow_context, flow_tag, fte->action.flow_tag);
|
||||||
MLX5_SET(flow_context, in_flow_context, action, fte->action);
|
MLX5_SET(flow_context, in_flow_context, action, fte->action.action);
|
||||||
MLX5_SET(flow_context, in_flow_context, encap_id, fte->encap_id);
|
MLX5_SET(flow_context, in_flow_context, encap_id, fte->action.encap_id);
|
||||||
MLX5_SET(flow_context, in_flow_context, modify_header_id, fte->modify_id);
|
MLX5_SET(flow_context, in_flow_context, modify_header_id,
|
||||||
|
fte->action.modify_id);
|
||||||
in_match_value = MLX5_ADDR_OF(flow_context, in_flow_context,
|
in_match_value = MLX5_ADDR_OF(flow_context, in_flow_context,
|
||||||
match_value);
|
match_value);
|
||||||
memcpy(in_match_value, &fte->val, sizeof(fte->val));
|
memcpy(in_match_value, &fte->val, sizeof(fte->val));
|
||||||
|
|
||||||
in_dests = MLX5_ADDR_OF(flow_context, in_flow_context, destination);
|
in_dests = MLX5_ADDR_OF(flow_context, in_flow_context, destination);
|
||||||
if (fte->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
|
if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
|
||||||
int list_size = 0;
|
int list_size = 0;
|
||||||
|
|
||||||
list_for_each_entry(dst, &fte->node.children, node.list) {
|
list_for_each_entry(dst, &fte->node.children, node.list) {
|
||||||
|
@ -375,7 +376,7 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
|
||||||
list_size);
|
list_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fte->action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
|
if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
|
||||||
int max_list_size = BIT(MLX5_CAP_FLOWTABLE_TYPE(dev,
|
int max_list_size = BIT(MLX5_CAP_FLOWTABLE_TYPE(dev,
|
||||||
log_max_flow_counter,
|
log_max_flow_counter,
|
||||||
ft->type));
|
ft->type));
|
||||||
|
|
|
@ -481,12 +481,12 @@ static void del_sw_hw_rule(struct fs_node *node)
|
||||||
if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_COUNTER &&
|
if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_COUNTER &&
|
||||||
--fte->dests_size) {
|
--fte->dests_size) {
|
||||||
modify_mask = BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION);
|
modify_mask = BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION);
|
||||||
fte->action &= ~MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
||||||
update_fte = true;
|
update_fte = true;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((fte->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
|
if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
|
||||||
--fte->dests_size) {
|
--fte->dests_size) {
|
||||||
modify_mask = BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST),
|
modify_mask = BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST),
|
||||||
update_fte = true;
|
update_fte = true;
|
||||||
|
@ -623,10 +623,7 @@ static struct fs_fte *alloc_fte(struct mlx5_flow_table *ft,
|
||||||
|
|
||||||
memcpy(fte->val, match_value, sizeof(fte->val));
|
memcpy(fte->val, match_value, sizeof(fte->val));
|
||||||
fte->node.type = FS_TYPE_FLOW_ENTRY;
|
fte->node.type = FS_TYPE_FLOW_ENTRY;
|
||||||
fte->flow_tag = flow_act->flow_tag;
|
fte->action = *flow_act;
|
||||||
fte->action = flow_act->action;
|
|
||||||
fte->encap_id = flow_act->encap_id;
|
|
||||||
fte->modify_id = flow_act->modify_id;
|
|
||||||
|
|
||||||
tree_init_node(&fte->node, del_hw_fte, del_sw_fte);
|
tree_init_node(&fte->node, del_hw_fte, del_sw_fte);
|
||||||
|
|
||||||
|
@ -892,7 +889,7 @@ static int _mlx5_modify_rule_destination(struct mlx5_flow_rule *rule,
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
fs_get_obj(fte, rule->node.parent);
|
fs_get_obj(fte, rule->node.parent);
|
||||||
if (!(fte->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST))
|
if (!(fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
down_write_ref_node(&fte->node);
|
down_write_ref_node(&fte->node);
|
||||||
fs_get_obj(fg, fte->node.parent);
|
fs_get_obj(fg, fte->node.parent);
|
||||||
|
@ -1448,16 +1445,17 @@ static bool check_conflicting_actions(u32 action1, u32 action2)
|
||||||
|
|
||||||
static int check_conflicting_ftes(struct fs_fte *fte, const struct mlx5_flow_act *flow_act)
|
static int check_conflicting_ftes(struct fs_fte *fte, const struct mlx5_flow_act *flow_act)
|
||||||
{
|
{
|
||||||
if (check_conflicting_actions(flow_act->action, fte->action)) {
|
if (check_conflicting_actions(flow_act->action, fte->action.action)) {
|
||||||
mlx5_core_warn(get_dev(&fte->node),
|
mlx5_core_warn(get_dev(&fte->node),
|
||||||
"Found two FTEs with conflicting actions\n");
|
"Found two FTEs with conflicting actions\n");
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flow_act->has_flow_tag && fte->flow_tag != flow_act->flow_tag) {
|
if (flow_act->has_flow_tag &&
|
||||||
|
fte->action.flow_tag != flow_act->flow_tag) {
|
||||||
mlx5_core_warn(get_dev(&fte->node),
|
mlx5_core_warn(get_dev(&fte->node),
|
||||||
"FTE flow tag %u already exists with different flow tag %u\n",
|
"FTE flow tag %u already exists with different flow tag %u\n",
|
||||||
fte->flow_tag,
|
fte->action.flow_tag,
|
||||||
flow_act->flow_tag);
|
flow_act->flow_tag);
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
@ -1481,12 +1479,12 @@ static struct mlx5_flow_handle *add_rule_fg(struct mlx5_flow_group *fg,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
old_action = fte->action;
|
old_action = fte->action.action;
|
||||||
fte->action |= flow_act->action;
|
fte->action.action |= flow_act->action;
|
||||||
handle = add_rule_fte(fte, fg, dest, dest_num,
|
handle = add_rule_fte(fte, fg, dest, dest_num,
|
||||||
old_action != flow_act->action);
|
old_action != flow_act->action);
|
||||||
if (IS_ERR(handle)) {
|
if (IS_ERR(handle)) {
|
||||||
fte->action = old_action;
|
fte->action.action = old_action;
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
trace_mlx5_fs_set_fte(fte, false);
|
trace_mlx5_fs_set_fte(fte, false);
|
||||||
|
|
|
@ -176,11 +176,8 @@ struct fs_fte {
|
||||||
struct fs_node node;
|
struct fs_node node;
|
||||||
u32 val[MLX5_ST_SZ_DW_MATCH_PARAM];
|
u32 val[MLX5_ST_SZ_DW_MATCH_PARAM];
|
||||||
u32 dests_size;
|
u32 dests_size;
|
||||||
u32 flow_tag;
|
|
||||||
u32 index;
|
u32 index;
|
||||||
u32 action;
|
struct mlx5_flow_act action;
|
||||||
u32 encap_id;
|
|
||||||
u32 modify_id;
|
|
||||||
enum fs_fte_status status;
|
enum fs_fte_status status;
|
||||||
struct mlx5_fc *counter;
|
struct mlx5_fc *counter;
|
||||||
struct rhash_head hash;
|
struct rhash_head hash;
|
||||||
|
|
Loading…
Reference in New Issue