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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:22:35 +0000 (10:22 +0200)
[ Upstream commit 7b0c6338597613f465d131bd939a51844a00455a ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index 00834c914dc64a6f7a4b8dd10d7a8fe76e53ecb4..a197dd7ca73bc781ec44840ec7c4ffd3581b0464 100644 (file)
@@ -2031,16 +2031,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);
        }