Commit 48cbde4b authored by Alex Vesker's avatar Alex Vesker Committed by Saeed Mahameed

net/mlx5: DR, Fix getting incorrect prev node in ste_free

When we free an STE and the STE is in the middle of collision
list, the prev_ste was obtained incorrectly from the list.
To avoid such issues list_entry calls replaced with standard list API.

Fixes: 26d688e3 ("net/mlx5: DR, Add Steering entry (STE) utilities")
Signed-off-by: default avatarAlex Vesker <valex@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent cc5fd15f
...@@ -458,11 +458,9 @@ static int dr_matcher_add_to_tbl(struct mlx5dr_matcher *matcher) ...@@ -458,11 +458,9 @@ static int dr_matcher_add_to_tbl(struct mlx5dr_matcher *matcher)
prev_matcher = NULL; prev_matcher = NULL;
if (next_matcher && !first) if (next_matcher && !first)
prev_matcher = list_entry(next_matcher->matcher_list.prev, prev_matcher = list_prev_entry(next_matcher, matcher_list);
struct mlx5dr_matcher,
matcher_list);
else if (!first) else if (!first)
prev_matcher = list_entry(tbl->matcher_list.prev, prev_matcher = list_last_entry(&tbl->matcher_list,
struct mlx5dr_matcher, struct mlx5dr_matcher,
matcher_list); matcher_list);
......
...@@ -18,7 +18,7 @@ static int dr_rule_append_to_miss_list(struct mlx5dr_ste *new_last_ste, ...@@ -18,7 +18,7 @@ static int dr_rule_append_to_miss_list(struct mlx5dr_ste *new_last_ste,
struct mlx5dr_ste *last_ste; struct mlx5dr_ste *last_ste;
/* The new entry will be inserted after the last */ /* The new entry will be inserted after the last */
last_ste = list_entry(miss_list->prev, struct mlx5dr_ste, miss_list_node); last_ste = list_last_entry(miss_list, struct mlx5dr_ste, miss_list_node);
WARN_ON(!last_ste); WARN_ON(!last_ste);
ste_info_last = kzalloc(sizeof(*ste_info_last), GFP_KERNEL); ste_info_last = kzalloc(sizeof(*ste_info_last), GFP_KERNEL);
......
...@@ -429,12 +429,9 @@ static void dr_ste_remove_middle_ste(struct mlx5dr_ste *ste, ...@@ -429,12 +429,9 @@ static void dr_ste_remove_middle_ste(struct mlx5dr_ste *ste,
struct mlx5dr_ste *prev_ste; struct mlx5dr_ste *prev_ste;
u64 miss_addr; u64 miss_addr;
prev_ste = list_entry(mlx5dr_ste_get_miss_list(ste)->prev, struct mlx5dr_ste, prev_ste = list_prev_entry(ste, miss_list_node);
miss_list_node); if (WARN_ON(!prev_ste))
if (!prev_ste) {
WARN_ON(true);
return; return;
}
miss_addr = mlx5dr_ste_get_miss_addr(ste->hw_ste); miss_addr = mlx5dr_ste_get_miss_addr(ste->hw_ste);
mlx5dr_ste_set_miss_addr(prev_ste->hw_ste, miss_addr); mlx5dr_ste_set_miss_addr(prev_ste->hw_ste, miss_addr);
...@@ -461,7 +458,7 @@ void mlx5dr_ste_free(struct mlx5dr_ste *ste, ...@@ -461,7 +458,7 @@ void mlx5dr_ste_free(struct mlx5dr_ste *ste,
struct mlx5dr_ste_htbl *stats_tbl; struct mlx5dr_ste_htbl *stats_tbl;
LIST_HEAD(send_ste_list); LIST_HEAD(send_ste_list);
first_ste = list_entry(mlx5dr_ste_get_miss_list(ste)->next, first_ste = list_first_entry(mlx5dr_ste_get_miss_list(ste),
struct mlx5dr_ste, miss_list_node); struct mlx5dr_ste, miss_list_node);
stats_tbl = first_ste->htbl; stats_tbl = first_ste->htbl;
...@@ -479,8 +476,7 @@ void mlx5dr_ste_free(struct mlx5dr_ste *ste, ...@@ -479,8 +476,7 @@ void mlx5dr_ste_free(struct mlx5dr_ste *ste,
if (last_ste == first_ste) if (last_ste == first_ste)
next_ste = NULL; next_ste = NULL;
else else
next_ste = list_entry(ste->miss_list_node.next, next_ste = list_next_entry(ste, miss_list_node);
struct mlx5dr_ste, miss_list_node);
if (!next_ste) { if (!next_ste) {
/* One and only entry in the list */ /* One and only entry in the list */
......
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