From bf930ccbeceed95eb94ab9faec8c38850a652f20 Mon Sep 17 00:00:00 2001 From: Hamdan Igbaria Date: Thu, 23 Nov 2023 13:01:56 +0200 Subject: [PATCH] mlx5: DR, Fix pattern compare When comparing two patterns validate they have the same type. Fixes: 9e305aa7c720 ("mlx5: DR, Support RX decap L3 action for STE V1 type") Signed-off-by: Hamdan Igbaria Reviewed-by: Erez Shitrit Signed-off-by: Yishai Hadas --- providers/mlx5/dr_ptrn.c | 12 ++++++++---- providers/mlx5/mlx5dv_dr.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/providers/mlx5/dr_ptrn.c b/providers/mlx5/dr_ptrn.c index e0ebc3e7f..49ed04526 100644 --- a/providers/mlx5/dr_ptrn.c +++ b/providers/mlx5/dr_ptrn.c @@ -54,12 +54,13 @@ static bool dr_ptrn_compare_modify_hdr(size_t cur_num_of_actions, } static bool dr_ptrn_compare_pattern(enum dr_ptrn_type type, + enum dr_ptrn_type cur_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) + if ((cur_num_of_actions != num_of_actions) || (cur_type != type)) return false; switch (type) { @@ -87,6 +88,7 @@ dr_ptrn_find_cached_pattern(struct dr_ptrn_mngr *mngr, list_for_each_safe(&mngr->ptrn_list, cached_pattern, tmp, list) { if (dr_ptrn_compare_pattern(type, + cached_pattern->type, cached_pattern->rewrite_param.num_of_actions, (__be64 *)cached_pattern->rewrite_param.data, num_of_actions, @@ -101,8 +103,8 @@ dr_ptrn_find_cached_pattern(struct dr_ptrn_mngr *mngr, } static struct dr_ptrn_obj * -dr_ptrn_alloc_pattern(struct dr_ptrn_mngr *mngr, - uint16_t num_of_actions, uint8_t *data) +dr_ptrn_alloc_pattern(struct dr_ptrn_mngr *mngr, uint16_t num_of_actions, + uint8_t *data, enum dr_ptrn_type type) { struct dr_ptrn_obj *pattern; struct dr_icm_chunk *chunk; @@ -135,6 +137,8 @@ dr_ptrn_alloc_pattern(struct dr_ptrn_mngr *mngr, goto free_pattern; } + pattern->type = type; + memcpy(pattern->rewrite_param.data, data, num_of_actions * DR_MODIFY_ACTION_SIZE); pattern->rewrite_param.chunk = chunk; pattern->rewrite_param.index = index; @@ -178,7 +182,7 @@ dr_ptrn_cache_get_pattern(struct dr_ptrn_mngr *mngr, (__be64 *)data); if (!pattern) { /* Alloc and add new pattern to cache */ - pattern = dr_ptrn_alloc_pattern(mngr, num_of_actions, data); + pattern = dr_ptrn_alloc_pattern(mngr, num_of_actions, data, type); if (!pattern) goto out_unlock; diff --git a/providers/mlx5/mlx5dv_dr.h b/providers/mlx5/mlx5dv_dr.h index 689e92ff4..478fedd68 100644 --- a/providers/mlx5/mlx5dv_dr.h +++ b/providers/mlx5/mlx5dv_dr.h @@ -1243,6 +1243,7 @@ struct dr_ptrn_obj { struct dr_rewrite_param rewrite_param; atomic_int refcount; struct list_node list; + enum dr_ptrn_type type; }; struct dr_arg_obj {