mirror of https://gitee.com/openkylin/linux.git
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: 26d688e33f
("net/mlx5: DR, Add Steering entry (STE) utilities")
Signed-off-by: Alex Vesker <valex@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
cc5fd15fc5
commit
48cbde4bd2
|
@ -458,13 +458,11 @@ static int dr_matcher_add_to_tbl(struct mlx5dr_matcher *matcher)
|
|||
|
||||
prev_matcher = NULL;
|
||||
if (next_matcher && !first)
|
||||
prev_matcher = list_entry(next_matcher->matcher_list.prev,
|
||||
struct mlx5dr_matcher,
|
||||
matcher_list);
|
||||
prev_matcher = list_prev_entry(next_matcher, matcher_list);
|
||||
else if (!first)
|
||||
prev_matcher = list_entry(tbl->matcher_list.prev,
|
||||
struct mlx5dr_matcher,
|
||||
matcher_list);
|
||||
prev_matcher = list_last_entry(&tbl->matcher_list,
|
||||
struct mlx5dr_matcher,
|
||||
matcher_list);
|
||||
|
||||
if (dmn->type == MLX5DR_DOMAIN_TYPE_FDB ||
|
||||
dmn->type == MLX5DR_DOMAIN_TYPE_NIC_RX) {
|
||||
|
|
|
@ -18,7 +18,7 @@ static int dr_rule_append_to_miss_list(struct mlx5dr_ste *new_last_ste,
|
|||
struct mlx5dr_ste *last_ste;
|
||||
|
||||
/* 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);
|
||||
|
||||
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,
|
|||
struct mlx5dr_ste *prev_ste;
|
||||
u64 miss_addr;
|
||||
|
||||
prev_ste = list_entry(mlx5dr_ste_get_miss_list(ste)->prev, struct mlx5dr_ste,
|
||||
miss_list_node);
|
||||
if (!prev_ste) {
|
||||
WARN_ON(true);
|
||||
prev_ste = list_prev_entry(ste, miss_list_node);
|
||||
if (WARN_ON(!prev_ste))
|
||||
return;
|
||||
}
|
||||
|
||||
miss_addr = mlx5dr_ste_get_miss_addr(ste->hw_ste);
|
||||
mlx5dr_ste_set_miss_addr(prev_ste->hw_ste, miss_addr);
|
||||
|
@ -461,8 +458,8 @@ void mlx5dr_ste_free(struct mlx5dr_ste *ste,
|
|||
struct mlx5dr_ste_htbl *stats_tbl;
|
||||
LIST_HEAD(send_ste_list);
|
||||
|
||||
first_ste = list_entry(mlx5dr_ste_get_miss_list(ste)->next,
|
||||
struct mlx5dr_ste, miss_list_node);
|
||||
first_ste = list_first_entry(mlx5dr_ste_get_miss_list(ste),
|
||||
struct mlx5dr_ste, miss_list_node);
|
||||
stats_tbl = first_ste->htbl;
|
||||
|
||||
/* Two options:
|
||||
|
@ -479,8 +476,7 @@ void mlx5dr_ste_free(struct mlx5dr_ste *ste,
|
|||
if (last_ste == first_ste)
|
||||
next_ste = NULL;
|
||||
else
|
||||
next_ste = list_entry(ste->miss_list_node.next,
|
||||
struct mlx5dr_ste, miss_list_node);
|
||||
next_ste = list_next_entry(ste, miss_list_node);
|
||||
|
||||
if (!next_ste) {
|
||||
/* One and only entry in the list */
|
||||
|
|
Loading…
Reference in New Issue