diff options
author | Yevgeny Kliteynik <kliteyn@nvidia.com> | 2022-11-15 18:19:39 +0200 |
---|---|---|
committer | Saeed Mahameed <saeedm@nvidia.com> | 2023-04-14 15:06:22 -0700 |
commit | 40ff097f2503869fe5d96f796cf84ad4b17eaa9b (patch) | |
tree | 74cb70157fa804b885d4529692e42a760e211ab8 /drivers/net/ethernet | |
parent | 947e258537ea43098d778b3315bde4fe1a1a10a3 (diff) |
net/mlx5: DR, Modify header action of size 1 optimization
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>
Diffstat (limited to 'drivers/net/ethernet')
3 files changed, 52 insertions, 25 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c index 8f8f0a0b38fd..0eb9a8d7f282 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_action.c @@ -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: diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste_v1.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste_v1.c index d2d312454564..4c0704ad166b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste_v1.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste_v1.c @@ -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; } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h index 3ffda3d302e0..37b7b1a79f93 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h @@ -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; |