]> git.itanic.dy.fi Git - linux-stable/commitdiff
net/mlx5: DR, Modify header action of size 1 optimization
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Tue, 15 Nov 2022 16:19:39 +0000 (18:19 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 14 Apr 2023 22:06:22 +0000 (15:06 -0700)
Set modify header action of size 1 directly on the STE for supporting
devices, thus reducing number of hops and cache misses.

Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: Alex Vesker <valex@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste_v1.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h

index 8f8f0a0b38fd07699e592f1fd22b794ae4ef0c8f..0eb9a8d7f282fc93e99ab4598a52b950d877f6d0 100644 (file)
@@ -832,14 +832,20 @@ int mlx5dr_actions_build_ste_arr(struct mlx5dr_matcher *matcher,
                        }
                        break;
                case DR_ACTION_TYP_MODIFY_HDR:
-                       if (action->rewrite->ptrn && action->rewrite->arg) {
-                               attr.modify_index = mlx5dr_arg_get_obj_id(action->rewrite->arg);
-                               attr.modify_actions = action->rewrite->ptrn->num_of_actions;
-                               attr.modify_pat_idx = action->rewrite->ptrn->index;
-                       } else {
-                               attr.modify_index = action->rewrite->index;
+                       if (action->rewrite->single_action_opt) {
                                attr.modify_actions = action->rewrite->num_of_actions;
-                               attr.modify_pat_idx = MLX5DR_INVALID_PATTERN_INDEX;
+                               attr.single_modify_action = action->rewrite->data;
+                       } else {
+                               if (action->rewrite->ptrn && action->rewrite->arg) {
+                                       attr.modify_index =
+                                               mlx5dr_arg_get_obj_id(action->rewrite->arg);
+                                       attr.modify_actions = action->rewrite->ptrn->num_of_actions;
+                                       attr.modify_pat_idx = action->rewrite->ptrn->index;
+                               } else {
+                                       attr.modify_index = action->rewrite->index;
+                                       attr.modify_actions = action->rewrite->num_of_actions;
+                                       attr.modify_pat_idx = MLX5DR_INVALID_PATTERN_INDEX;
+                               }
                        }
                        if (action->rewrite->modify_ttl)
                                dr_action_modify_ttl_adjust(dmn, &attr, rx_rule,
@@ -1998,9 +2004,15 @@ static int dr_action_create_modify_action(struct mlx5dr_domain *dmn,
        action->rewrite->data = (u8 *)hw_actions;
        action->rewrite->num_of_actions = num_hw_actions;
 
-       ret = mlx5dr_ste_alloc_modify_hdr(action);
-       if (ret)
-               goto free_hw_actions;
+       if (num_hw_actions == 1 &&
+           dmn->info.caps.sw_format_ver >= MLX5_STEERING_FORMAT_CONNECTX_6DX) {
+               action->rewrite->single_action_opt = true;
+       } else {
+               action->rewrite->single_action_opt = false;
+               ret = mlx5dr_ste_alloc_modify_hdr(action);
+               if (ret)
+                       goto free_hw_actions;
+       }
 
        return 0;
 
@@ -2151,6 +2163,7 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action)
                break;
        case DR_ACTION_TYP_TNL_L3_TO_L2:
                mlx5dr_ste_free_modify_hdr(action);
+               kfree(action->rewrite->data);
                refcount_dec(&action->rewrite->dmn->refcount);
                break;
        case DR_ACTION_TYP_L2_TO_TNL_L2:
@@ -2161,7 +2174,9 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action)
                refcount_dec(&action->reformat->dmn->refcount);
                break;
        case DR_ACTION_TYP_MODIFY_HDR:
-               mlx5dr_ste_free_modify_hdr(action);
+               if (!action->rewrite->single_action_opt)
+                       mlx5dr_ste_free_modify_hdr(action);
+               kfree(action->rewrite->data);
                refcount_dec(&action->rewrite->dmn->refcount);
                break;
        case DR_ACTION_TYP_SAMPLER:
index d2d3124545645b9e05b589d89462bf934ec5c806..4c0704ad166b35a2309508fcdf8ecda3c316e5c9 100644 (file)
@@ -499,16 +499,21 @@ static void dr_ste_v1_set_accelerated_rewrite_actions(u8 *hw_ste_p,
                                                      u8 *d_action,
                                                      u16 num_of_actions,
                                                      u32 rewrite_pattern,
-                                                     u32 rewrite_args)
+                                                     u32 rewrite_args,
+                                                     u8 *action_data)
 {
-       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
-                action_id, DR_STE_V1_ACTION_ID_ACCELERATED_LIST);
-       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
-                modify_actions_pattern_pointer, rewrite_pattern);
-       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
-                number_of_modify_actions, num_of_actions);
-       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
-                modify_actions_argument_pointer, rewrite_args);
+       if (action_data) {
+               memcpy(d_action, action_data, DR_MODIFY_ACTION_SIZE);
+       } else {
+               MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                        action_id, DR_STE_V1_ACTION_ID_ACCELERATED_LIST);
+               MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                        modify_actions_pattern_pointer, rewrite_pattern);
+               MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                        number_of_modify_actions, num_of_actions);
+               MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                        modify_actions_argument_pointer, rewrite_args);
+       }
 
        dr_ste_v1_set_reparse(hw_ste_p);
 }
@@ -532,14 +537,16 @@ static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p,
                                          u8 *action,
                                          u16 num_of_actions,
                                          u32 rewrite_pattern,
-                                         u32 rewrite_args)
+                                         u32 rewrite_args,
+                                         u8 *action_data)
 {
        if (rewrite_pattern != MLX5DR_INVALID_PATTERN_INDEX)
                return dr_ste_v1_set_accelerated_rewrite_actions(hw_ste_p,
                                                                 action,
                                                                 num_of_actions,
                                                                 rewrite_pattern,
-                                                                rewrite_args);
+                                                                rewrite_args,
+                                                                action_data);
 
        /* fall back to the code that doesn't support accelerated modify header */
        return dr_ste_v1_set_basic_rewrite_actions(hw_ste_p,
@@ -653,7 +660,8 @@ void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn,
                dr_ste_v1_set_rewrite_actions(last_ste, action,
                                              attr->modify_actions,
                                              attr->modify_pat_idx,
-                                             attr->modify_index);
+                                             attr->modify_index,
+                                             attr->single_modify_action);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
                allow_encap = false;
@@ -784,7 +792,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
                dr_ste_v1_set_rewrite_actions(last_ste, action,
                                              attr->decap_actions,
                                              attr->decap_pat_idx,
-                                             attr->decap_index);
+                                             attr->decap_index,
+                                             NULL);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
                allow_modify_hdr = false;
@@ -840,7 +849,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
                dr_ste_v1_set_rewrite_actions(last_ste, action,
                                              attr->modify_actions,
                                              attr->modify_pat_idx,
-                                             attr->modify_index);
+                                             attr->modify_index,
+                                             attr->single_modify_action);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
        }
index 3ffda3d302e01b751b089049fe305274bd011e08..37b7b1a79f93e86e1850ca6524d2f2633393ca14 100644 (file)
@@ -267,6 +267,7 @@ struct mlx5dr_ste_actions_attr {
        u32     modify_index;
        u32     modify_pat_idx;
        u16     modify_actions;
+       u8      *single_modify_action;
        u32     decap_index;
        u32     decap_pat_idx;
        u16     decap_actions;
@@ -1035,6 +1036,7 @@ struct mlx5dr_action_rewrite {
        u8 *data;
        u16 num_of_actions;
        u32 index;
+       u8 single_action_opt:1;
        u8 allow_rx:1;
        u8 allow_tx:1;
        u8 modify_ttl:1;