diff options
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 31 |
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 | } |
| 477 | out: | 474 | out: |
| 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 | ||
| 1883 | void mlx5_del_flow_rules(struct mlx5_flow_handle *handle) | 1879 | void 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 | } |
| 1891 | EXPORT_SYMBOL(mlx5_del_flow_rules); | 1910 | EXPORT_SYMBOL(mlx5_del_flow_rules); |
