Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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 Diff line number Diff line
@@ -458,11 +458,9 @@ 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,
		prev_matcher = list_last_entry(&tbl->matcher_list,
					       struct mlx5dr_matcher,
					       matcher_list);

+1 −1
Original line number 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;

	/* 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);
+5 −9
Original line number 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;
	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,7 +458,7 @@ 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,
	first_ste = list_first_entry(mlx5dr_ste_get_miss_list(ste),
				     struct mlx5dr_ste, miss_list_node);
	stats_tbl = first_ste->htbl;

@@ -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 */