Skip to content

Commit

Permalink
mlx5: DR, Support RX decap L3 action for STE V1 type
Browse files Browse the repository at this point in the history
Use the mechanism of pattern and argument data in modify-header action.

Signed-off-by: Muhammad Sammar <muhammads@nvidia.com>
Signed-off-by: Erez Shitrit <erezsh@mellanox.com>
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
  • Loading branch information
Muhammad Sammar authored and Yishai Hadas committed Jun 19, 2022
1 parent 6ce4b72 commit 9e305aa
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 24 deletions.
44 changes: 24 additions & 20 deletions providers/mlx5/dr_action.c
Expand Up @@ -706,6 +706,9 @@ int dr_actions_build_ste_arr(struct mlx5dv_dr_matcher *matcher,
attr.decap_actions = action->rewrite.param.num_of_actions;
attr.decap_with_vlan =
attr.decap_actions == WITH_VLAN_NUM_HW_ACTIONS;
if (action->rewrite.ptrn_arg.ptrn &&
action->rewrite.ptrn_arg.arg)
attr.args_index = dr_arg_get_object_id(action->rewrite.ptrn_arg.arg);
break;
case DR_ACTION_TYP_MODIFY_HDR:
if (action->rewrite.is_root_level) {
Expand Down Expand Up @@ -1367,6 +1370,7 @@ dr_action_create_reformat_action(struct mlx5dv_dr_domain *dmn,
struct mlx5dv_dr_action *action)
{
struct mlx5dv_devx_obj *obj;
uint8_t *hw_actions;

switch (action->action_type) {
case DR_ACTION_TYP_L2_TO_TNL_L2:
Expand All @@ -1393,36 +1397,31 @@ dr_action_create_reformat_action(struct mlx5dv_dr_domain *dmn,
}
case DR_ACTION_TYP_TNL_L3_TO_L2:
{
uint8_t hw_actions[ACTION_CACHE_LINE_SIZE] = {};
int ret;

hw_actions = calloc(1, ACTION_CACHE_LINE_SIZE);
if (!hw_actions) {
errno = ENOMEM;
return errno;
}

ret = dr_ste_set_action_decap_l3_list(dmn->ste_ctx,
data, data_sz,
hw_actions,
ACTION_CACHE_LINE_SIZE,
&action->rewrite.param.num_of_actions);
if (ret) {
dr_dbg(dmn, "Failed creating decap l3 action list\n");
return ret;
goto free_hw_actions;
}

action->rewrite.param.chunk = dr_icm_alloc_chunk(dmn->action_icm_pool,
DR_CHUNK_SIZE_8);
if (!action->rewrite.param.chunk) {
dr_dbg(dmn, "Failed allocating modify header chunk\n");
return errno;
}
action->rewrite.param.data = hw_actions;
action->rewrite.dmn = dmn;

action->rewrite.param.data = (void *)hw_actions;
action->rewrite.param.index = (action->rewrite.param.chunk->icm_addr -
dmn->info.caps.hdr_modify_icm_addr) /
ACTION_CACHE_LINE_SIZE;

ret = dr_send_postsend_action(dmn, action);
ret = dr_ste_alloc_modify_hdr(action);
if (ret) {
dr_dbg(dmn, "Writing decap l3 actions to ICM failed\n");
dr_icm_free_chunk(action->rewrite.param.chunk);
return ret;
dr_dbg(dmn, "Failed prepare reformat data\n");
goto free_hw_actions;
}
return 0;
}
Expand All @@ -1431,6 +1430,9 @@ dr_action_create_reformat_action(struct mlx5dv_dr_domain *dmn,
errno = ENOTSUP;
return errno;
}
free_hw_actions:
free(hw_actions);
return errno;
}

struct mlx5dv_dr_action *
Expand Down Expand Up @@ -2808,10 +2810,12 @@ int mlx5dv_dr_action_destroy(struct mlx5dv_dr_action *action)
atomic_fetch_sub(&action->reformat.dmn->refcount, 1);
break;
case DR_ACTION_TYP_TNL_L3_TO_L2:
if (action->reformat.is_root_level)
if (action->reformat.is_root_level) {
mlx5_destroy_flow_action(action->reformat.flow_action);
else
dr_icm_free_chunk(action->rewrite.param.chunk);
} else {
dr_ste_free_modify_hdr(action);
free(action->rewrite.param.data);
}
atomic_fetch_sub(&action->reformat.dmn->refcount, 1);
break;
case DR_ACTION_TYP_L2_TO_TNL_L2:
Expand Down
35 changes: 31 additions & 4 deletions providers/mlx5/dr_ptrn.c
Expand Up @@ -48,19 +48,44 @@ static bool dr_ptrn_compare_modify_hdr(size_t cur_num_of_actions,
return true;
}

static bool dr_ptrn_compare_pattern(enum dr_ptrn_type type,
size_t cur_num_of_actions,
__be64 cur_hw_action[],
size_t num_of_actions,
__be64 hw_action[])
{
if (cur_num_of_actions != num_of_actions)
return false;

switch (type) {
case DR_PTRN_TYP_MODIFY_HDR:
return dr_ptrn_compare_modify_hdr(cur_num_of_actions,
(__be64 *)cur_hw_action,
num_of_actions,
(__be64 *)hw_action);
case DR_PTRN_TYP_TNL_L3_TO_L2:
return true;
default:
assert(false);
return false;
}
}

static struct dr_ptrn_obj *
dr_ptrn_find_cached_pattern(struct dr_ptrn_mngr *mngr,
enum dr_ptrn_type type,
size_t num_of_actions,
__be64 hw_actions[])
{
struct dr_ptrn_obj *tmp;
struct dr_ptrn_obj *cached_pattern;

list_for_each_safe(&mngr->ptrn_list, cached_pattern, tmp, list) {
if (dr_ptrn_compare_modify_hdr(cached_pattern->rewrite_param.num_of_actions,
(__be64 *)cached_pattern->rewrite_param.data,
num_of_actions,
hw_actions)) {
if (dr_ptrn_compare_pattern(type,
cached_pattern->rewrite_param.num_of_actions,
(__be64 *)cached_pattern->rewrite_param.data,
num_of_actions,
hw_actions)) {
list_del(&cached_pattern->list);
list_add(&mngr->ptrn_list, &cached_pattern->list);
return cached_pattern;
Expand Down Expand Up @@ -105,6 +130,7 @@ dr_ptrn_alloc_pattern(struct dr_ptrn_mngr *mngr,

struct dr_ptrn_obj *
dr_ptrn_cache_get_pattern(struct dr_ptrn_mngr *mngr,
enum dr_ptrn_type type,
uint16_t num_of_actions,
uint8_t *data)
{
Expand All @@ -118,6 +144,7 @@ dr_ptrn_cache_get_pattern(struct dr_ptrn_mngr *mngr,

pthread_mutex_lock(&mngr->modify_hdr_mutex);
pattern = dr_ptrn_find_cached_pattern(mngr,
type,
num_of_actions,
(__be64 *)data);
if (!pattern) {
Expand Down
1 change: 1 addition & 0 deletions providers/mlx5/dr_ste_v1.c
Expand Up @@ -3475,6 +3475,7 @@ static int dr_ste_v1_alloc_modify_hdr_ptrn_arg(struct mlx5dv_dr_action *action,
}

action->rewrite.ptrn_arg.ptrn = dr_ptrn_cache_get_pattern(ptrn_mngr,
(enum dr_ptrn_type)action->action_type,
action->rewrite.param.num_of_actions,
action->rewrite.param.data);
if (!action->rewrite.ptrn_arg.ptrn) {
Expand Down
6 changes: 6 additions & 0 deletions providers/mlx5/mlx5dv_dr.h
Expand Up @@ -1199,6 +1199,11 @@ struct dr_rewrite_param {
uint32_t index;
};

enum dr_ptrn_type {
DR_PTRN_TYP_MODIFY_HDR = DR_ACTION_TYP_MODIFY_HDR,
DR_PTRN_TYP_TNL_L3_TO_L2 = DR_ACTION_TYP_TNL_L3_TO_L2,
};

struct dr_ptrn_obj {
struct dr_rewrite_param rewrite_param;
atomic_int refcount;
Expand Down Expand Up @@ -1709,6 +1714,7 @@ dr_ptrn_mngr_create(struct mlx5dv_dr_domain *dmn);
void dr_ptrn_mngr_destroy(struct dr_ptrn_mngr *mngr);
struct dr_ptrn_obj *
dr_ptrn_cache_get_pattern(struct dr_ptrn_mngr *mngr,
enum dr_ptrn_type type,
uint16_t num_of_actions,
uint8_t *data);
void dr_ptrn_cache_put_pattern(struct dr_ptrn_mngr *mngr,
Expand Down

0 comments on commit 9e305aa

Please sign in to comment.