Commit 40ff097f authored by Yevgeny Kliteynik's avatar Yevgeny Kliteynik Committed by Saeed Mahameed

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: default avatarYevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: default avatarAlex Vesker <valex@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 947e2585
...@@ -832,14 +832,20 @@ int mlx5dr_actions_build_ste_arr(struct mlx5dr_matcher *matcher, ...@@ -832,14 +832,20 @@ int mlx5dr_actions_build_ste_arr(struct mlx5dr_matcher *matcher,
} }
break; break;
case DR_ACTION_TYP_MODIFY_HDR: case DR_ACTION_TYP_MODIFY_HDR:
if (action->rewrite->ptrn && action->rewrite->arg) { if (action->rewrite->single_action_opt) {
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_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) if (action->rewrite->modify_ttl)
dr_action_modify_ttl_adjust(dmn, &attr, rx_rule, dr_action_modify_ttl_adjust(dmn, &attr, rx_rule,
...@@ -1998,9 +2004,15 @@ static int dr_action_create_modify_action(struct mlx5dr_domain *dmn, ...@@ -1998,9 +2004,15 @@ static int dr_action_create_modify_action(struct mlx5dr_domain *dmn,
action->rewrite->data = (u8 *)hw_actions; action->rewrite->data = (u8 *)hw_actions;
action->rewrite->num_of_actions = num_hw_actions; action->rewrite->num_of_actions = num_hw_actions;
ret = mlx5dr_ste_alloc_modify_hdr(action); if (num_hw_actions == 1 &&
if (ret) dmn->info.caps.sw_format_ver >= MLX5_STEERING_FORMAT_CONNECTX_6DX) {
goto free_hw_actions; 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; return 0;
...@@ -2151,6 +2163,7 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action) ...@@ -2151,6 +2163,7 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action)
break; break;
case DR_ACTION_TYP_TNL_L3_TO_L2: case DR_ACTION_TYP_TNL_L3_TO_L2:
mlx5dr_ste_free_modify_hdr(action); mlx5dr_ste_free_modify_hdr(action);
kfree(action->rewrite->data);
refcount_dec(&action->rewrite->dmn->refcount); refcount_dec(&action->rewrite->dmn->refcount);
break; break;
case DR_ACTION_TYP_L2_TO_TNL_L2: case DR_ACTION_TYP_L2_TO_TNL_L2:
...@@ -2161,7 +2174,9 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action) ...@@ -2161,7 +2174,9 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action)
refcount_dec(&action->reformat->dmn->refcount); refcount_dec(&action->reformat->dmn->refcount);
break; break;
case DR_ACTION_TYP_MODIFY_HDR: 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); refcount_dec(&action->rewrite->dmn->refcount);
break; break;
case DR_ACTION_TYP_SAMPLER: case DR_ACTION_TYP_SAMPLER:
......
...@@ -499,16 +499,21 @@ static void dr_ste_v1_set_accelerated_rewrite_actions(u8 *hw_ste_p, ...@@ -499,16 +499,21 @@ static void dr_ste_v1_set_accelerated_rewrite_actions(u8 *hw_ste_p,
u8 *d_action, u8 *d_action,
u16 num_of_actions, u16 num_of_actions,
u32 rewrite_pattern, u32 rewrite_pattern,
u32 rewrite_args) u32 rewrite_args,
u8 *action_data)
{ {
MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, if (action_data) {
action_id, DR_STE_V1_ACTION_ID_ACCELERATED_LIST); memcpy(d_action, action_data, DR_MODIFY_ACTION_SIZE);
MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, } else {
modify_actions_pattern_pointer, rewrite_pattern); MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, action_id, DR_STE_V1_ACTION_ID_ACCELERATED_LIST);
number_of_modify_actions, num_of_actions); MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, modify_actions_pattern_pointer, rewrite_pattern);
modify_actions_argument_pointer, rewrite_args); 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); dr_ste_v1_set_reparse(hw_ste_p);
} }
...@@ -532,14 +537,16 @@ static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p, ...@@ -532,14 +537,16 @@ static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p,
u8 *action, u8 *action,
u16 num_of_actions, u16 num_of_actions,
u32 rewrite_pattern, u32 rewrite_pattern,
u32 rewrite_args) u32 rewrite_args,
u8 *action_data)
{ {
if (rewrite_pattern != MLX5DR_INVALID_PATTERN_INDEX) if (rewrite_pattern != MLX5DR_INVALID_PATTERN_INDEX)
return dr_ste_v1_set_accelerated_rewrite_actions(hw_ste_p, return dr_ste_v1_set_accelerated_rewrite_actions(hw_ste_p,
action, action,
num_of_actions, num_of_actions,
rewrite_pattern, rewrite_pattern,
rewrite_args); rewrite_args,
action_data);
/* fall back to the code that doesn't support accelerated modify header */ /* fall back to the code that doesn't support accelerated modify header */
return dr_ste_v1_set_basic_rewrite_actions(hw_ste_p, 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, ...@@ -653,7 +660,8 @@ void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn,
dr_ste_v1_set_rewrite_actions(last_ste, action, dr_ste_v1_set_rewrite_actions(last_ste, action,
attr->modify_actions, attr->modify_actions,
attr->modify_pat_idx, attr->modify_pat_idx,
attr->modify_index); attr->modify_index,
attr->single_modify_action);
action_sz -= DR_STE_ACTION_DOUBLE_SZ; action_sz -= DR_STE_ACTION_DOUBLE_SZ;
action += DR_STE_ACTION_DOUBLE_SZ; action += DR_STE_ACTION_DOUBLE_SZ;
allow_encap = false; allow_encap = false;
...@@ -784,7 +792,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn, ...@@ -784,7 +792,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
dr_ste_v1_set_rewrite_actions(last_ste, action, dr_ste_v1_set_rewrite_actions(last_ste, action,
attr->decap_actions, attr->decap_actions,
attr->decap_pat_idx, attr->decap_pat_idx,
attr->decap_index); attr->decap_index,
NULL);
action_sz -= DR_STE_ACTION_DOUBLE_SZ; action_sz -= DR_STE_ACTION_DOUBLE_SZ;
action += DR_STE_ACTION_DOUBLE_SZ; action += DR_STE_ACTION_DOUBLE_SZ;
allow_modify_hdr = false; allow_modify_hdr = false;
...@@ -840,7 +849,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn, ...@@ -840,7 +849,8 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
dr_ste_v1_set_rewrite_actions(last_ste, action, dr_ste_v1_set_rewrite_actions(last_ste, action,
attr->modify_actions, attr->modify_actions,
attr->modify_pat_idx, attr->modify_pat_idx,
attr->modify_index); attr->modify_index,
attr->single_modify_action);
action_sz -= DR_STE_ACTION_DOUBLE_SZ; action_sz -= DR_STE_ACTION_DOUBLE_SZ;
action += DR_STE_ACTION_DOUBLE_SZ; action += DR_STE_ACTION_DOUBLE_SZ;
} }
......
...@@ -267,6 +267,7 @@ struct mlx5dr_ste_actions_attr { ...@@ -267,6 +267,7 @@ struct mlx5dr_ste_actions_attr {
u32 modify_index; u32 modify_index;
u32 modify_pat_idx; u32 modify_pat_idx;
u16 modify_actions; u16 modify_actions;
u8 *single_modify_action;
u32 decap_index; u32 decap_index;
u32 decap_pat_idx; u32 decap_pat_idx;
u16 decap_actions; u16 decap_actions;
...@@ -1035,6 +1036,7 @@ struct mlx5dr_action_rewrite { ...@@ -1035,6 +1036,7 @@ struct mlx5dr_action_rewrite {
u8 *data; u8 *data;
u16 num_of_actions; u16 num_of_actions;
u32 index; u32 index;
u8 single_action_opt:1;
u8 allow_rx:1; u8 allow_rx:1;
u8 allow_tx:1; u8 allow_tx:1;
u8 modify_ttl:1; u8 modify_ttl:1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment