net/mlx5: DR, Fix getting incorrect prev node in ste_free
authorAlex Vesker <valex@mellanox.com>
Thu, 19 Sep 2019 08:24:19 +0000 (11:24 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 24 Sep 2019 09:38:07 +0000 (12:38 +0300)
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 <valex@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_matcher.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste.c

index 01008cd66f75c86cb5887dc1dbfe7b5de2beb52e..9c2c25356dd045bc4de339793a68970b0af6fc32 100644 (file)
@@ -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) {
index 3bc3f66b8fa8fe0dac4f4e86e6988bc3e903e30f..4187f2b112b8e2e81f38d50a2daadc1ea666bd4c 100644 (file)
@@ -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);
index 6b0af64536d8b3b77d6384cda5c6b888b549de91..95b7221f573089bddbd4bf6da5494ae23f3f746a 100644 (file)
@@ -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 */