aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 42a6952ff9d0..0be3eb86dd84 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -430,9 +430,6 @@ static void modify_fte(struct fs_fte *fte)
430 struct mlx5_core_dev *dev; 430 struct mlx5_core_dev *dev;
431 int err; 431 int err;
432 432
433 if (!fte->modify_mask)
434 return;
435
436 fs_get_obj(fg, fte->node.parent); 433 fs_get_obj(fg, fte->node.parent);
437 fs_get_obj(ft, fg->node.parent); 434 fs_get_obj(ft, fg->node.parent);
438 dev = get_dev(&fte->node); 435 dev = get_dev(&fte->node);
@@ -475,7 +472,6 @@ static void del_sw_hw_rule(struct fs_node *node)
475 BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST); 472 BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST);
476 } 473 }
477out: 474out:
478 modify_fte(fte);
479 kfree(rule); 475 kfree(rule);
480} 476}
481 477
@@ -602,7 +598,7 @@ static struct fs_fte *alloc_fte(struct mlx5_flow_table *ft,
602 fte->node.type = FS_TYPE_FLOW_ENTRY; 598 fte->node.type = FS_TYPE_FLOW_ENTRY;
603 fte->action = *flow_act; 599 fte->action = *flow_act;
604 600
605 tree_init_node(&fte->node, del_hw_fte, del_sw_fte); 601 tree_init_node(&fte->node, NULL, del_sw_fte);
606 602
607 return fte; 603 return fte;
608} 604}
@@ -1882,10 +1878,33 @@ EXPORT_SYMBOL(mlx5_add_flow_rules);
1882 1878
1883void mlx5_del_flow_rules(struct mlx5_flow_handle *handle) 1879void mlx5_del_flow_rules(struct mlx5_flow_handle *handle)
1884{ 1880{
1881 struct fs_fte *fte;
1885 int i; 1882 int i;
1886 1883
1884 /* In order to consolidate the HW changes we lock the FTE for other
1885 * changes, and increase its refcount, in order not to perform the
1886 * "del" functions of the FTE. Will handle them here.
1887 * The removal of the rules is done under locked FTE.
1888 * After removing all the handle's rules, if there are remaining
1889 * rules, it means we just need to modify the FTE in FW, and
1890 * unlock/decrease the refcount we increased before.
1891 * Otherwise, it means the FTE should be deleted. First delete the
1892 * FTE in FW. Then, unlock the FTE, and proceed the tree_put_node of
1893 * the FTE, which will handle the last decrease of the refcount, as
1894 * well as required handling of its parent.
1895 */
1896 fs_get_obj(fte, handle->rule[0]->node.parent);
1897 down_write_ref_node(&fte->node, false);
1887 for (i = handle->num_rules - 1; i >= 0; i--) 1898 for (i = handle->num_rules - 1; i >= 0; i--)
1888 tree_remove_node(&handle->rule[i]->node, false); 1899 tree_remove_node(&handle->rule[i]->node, true);
1900 if (fte->modify_mask && fte->dests_size) {
1901 modify_fte(fte);
1902 up_write_ref_node(&fte->node, false);
1903 } else {
1904 del_hw_fte(&fte->node);
1905 up_write(&fte->node.lock);
1906 tree_put_node(&fte->node, false);
1907 }
1889 kfree(handle); 1908 kfree(handle);
1890} 1909}
1891EXPORT_SYMBOL(mlx5_del_flow_rules); 1910EXPORT_SYMBOL(mlx5_del_flow_rules);