From: Alex Vesker <va...@mellanox.com>

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: 26d688e33f88 ("net/mlx5: DR, Add Steering entry (STE) utilities")
Signed-off-by: Alex Vesker <va...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
---
 .../mellanox/mlx5/core/steering/dr_matcher.c       | 10 ++++------
 .../ethernet/mellanox/mlx5/core/steering/dr_rule.c |  2 +-
 .../ethernet/mellanox/mlx5/core/steering/dr_ste.c  | 14 +++++---------
 3 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c 
b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c
index 01008cd66f75..9c2c25356dd0 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c
@@ -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) {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c 
b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c
index 3bc3f66b8fa8..4187f2b112b8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c
@@ -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);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c 
b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c
index 6b0af64536d8..95b7221f5730 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c
@@ -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 */
-- 
2.21.0

Reply via email to