net/mlx5: Embed mlx5_flow_act into fs_fte
authorMatan Barak <matanb@mellanox.com>
Thu, 9 Nov 2017 12:12:15 +0000 (12:12 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 7 Mar 2018 06:20:13 +0000 (22:20 -0800)
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>
drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.h
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h

index 80eef4163f52e61d7f511cdd1aaba9dd6898fcd8..a6ba57fbb4146a6af9eebba079333b88a297702e 100644 (file)
@@ -163,9 +163,9 @@ TRACE_EVENT(mlx5_fs_set_fte,
                           fs_get_obj(__entry->fg, fte->node.parent);
                           __entry->group_index = __entry->fg->id;
                           __entry->index = fte->index;
-                          __entry->action = fte->action;
+                          __entry->action = fte->action.action;
                           __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,
                                  MLX5_ADDR_OF(fte_match_param,
                                               &__entry->fg->mask.match_criteria,
index ed3ea80a24be7953cf0e2ffc3b5f215707440c99..d9d7dd439bb9c69d7fd1133faa9a57a64ae19f96 100644 (file)
@@ -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);
        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, action, fte->action);
-       MLX5_SET(flow_context, in_flow_context, encap_id, fte->encap_id);
-       MLX5_SET(flow_context, in_flow_context, modify_header_id, fte->modify_id);
+       MLX5_SET(flow_context, in_flow_context, flow_tag, fte->action.flow_tag);
+       MLX5_SET(flow_context, in_flow_context, action, fte->action.action);
+       MLX5_SET(flow_context, in_flow_context, encap_id, fte->action.encap_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,
                                      match_value);
        memcpy(in_match_value, &fte->val, sizeof(fte->val));
 
        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;
 
                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);
        }
 
-       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,
                                        log_max_flow_counter,
                                        ft->type));
index 5c111186d103146d7fc9b37c8273599f92fcb4d3..2e4a1d4e0cea2674523e42c6414e88e73c5eeaf9 100644 (file)
@@ -481,12 +481,12 @@ static void del_sw_hw_rule(struct fs_node *node)
        if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_COUNTER  &&
            --fte->dests_size) {
                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;
                goto out;
        }
 
-       if ((fte->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
+       if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
            --fte->dests_size) {
                modify_mask = BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST),
                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));
        fte->node.type =  FS_TYPE_FLOW_ENTRY;
-       fte->flow_tag = flow_act->flow_tag;
-       fte->action = flow_act->action;
-       fte->encap_id = flow_act->encap_id;
-       fte->modify_id = flow_act->modify_id;
+       fte->action = *flow_act;
 
        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;
 
        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;
        down_write_ref_node(&fte->node);
        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)
 {
-       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),
                               "Found two FTEs with conflicting actions\n");
                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),
                               "FTE flow tag %u already exists with different flow tag %u\n",
-                              fte->flow_tag,
+                              fte->action.flow_tag,
                               flow_act->flow_tag);
                return -EEXIST;
        }
@@ -1481,12 +1479,12 @@ static struct mlx5_flow_handle *add_rule_fg(struct mlx5_flow_group *fg,
        if (ret)
                return ERR_PTR(ret);
 
-       old_action = fte->action;
-       fte->action |= flow_act->action;
+       old_action = fte->action.action;
+       fte->action.action |= flow_act->action;
        handle = add_rule_fte(fte, fg, dest, dest_num,
                              old_action != flow_act->action);
        if (IS_ERR(handle)) {
-               fte->action = old_action;
+               fte->action.action = old_action;
                return handle;
        }
        trace_mlx5_fs_set_fte(fte, false);
index 8586af9ce514102b8248007209211a89c0f77639..e26d3e9d5f9f9b7210a0f1dae9b041a2686c415a 100644 (file)
@@ -176,11 +176,8 @@ struct fs_fte {
        struct fs_node                  node;
        u32                             val[MLX5_ST_SZ_DW_MATCH_PARAM];
        u32                             dests_size;
-       u32                             flow_tag;
        u32                             index;
-       u32                             action;
-       u32                             encap_id;
-       u32                             modify_id;
+       struct mlx5_flow_act            action;
        enum fs_fte_status              status;
        struct mlx5_fc                  *counter;
        struct rhash_head               hash;