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

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
Loading
Loading
Loading
Loading
+4 −6
Original line number Original line Diff line number Diff line
@@ -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);


+1 −1
Original line number Original line Diff line number Diff line
@@ -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);
+5 −9
Original line number Original line Diff line number Diff line
@@ -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,
	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,
		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 */