net/mlx5: fs, delete the FTE when there are no rules attached to it
authorMark Bloch <mbloch@nvidia.com>
Tue, 15 Mar 2022 11:23:40 +0000 (11:23 +0000)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 3 May 2022 04:21:15 +0000 (21:21 -0700)
When an FTE has no children is means all the rules where removed
and the FTE can be deleted regardless of the dests_size value.
While dests_size should be 0 when there are no children
be extra careful not to leak memory or get firmware syndrome
if the proper bookkeeping of dests_size wasn't done.

Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Maor Gottlieb <maorg@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index ec91727..572237f 100644 (file)
@@ -2084,16 +2084,16 @@ void mlx5_del_flow_rules(struct mlx5_flow_handle *handle)
        down_write_ref_node(&fte->node, false);
        for (i = handle->num_rules - 1; i >= 0; i--)
                tree_remove_node(&handle->rule[i]->node, true);
-       if (fte->dests_size) {
-               if (fte->modify_mask)
-                       modify_fte(fte);
-               up_write_ref_node(&fte->node, false);
-       } else if (list_empty(&fte->node.children)) {
+       if (list_empty(&fte->node.children)) {
                del_hw_fte(&fte->node);
                /* Avoid double call to del_hw_fte */
                fte->node.del_hw_func = NULL;
                up_write_ref_node(&fte->node, false);
                tree_put_node(&fte->node, false);
+       } else if (fte->dests_size) {
+               if (fte->modify_mask)
+                       modify_fte(fte);
+               up_write_ref_node(&fte->node, false);
        } else {
                up_write_ref_node(&fte->node, false);
        }