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>
This commit is contained in:
parent
947e258537
commit
40ff097f25
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user