summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatan Barak2017-08-10 14:29:12 +0200
committerSaeed Mahameed2017-09-26 19:51:51 +0200
commitb92af5a72ca982f0aa3df22f57a178aa5b0f4357 (patch)
tree3824f4b56aa75cb6bc03ce7c36f6c8b378c29824
parentLinux 4.14-rc2 (diff)
downloadkernel-qcow2-linux-b92af5a72ca982f0aa3df22f57a178aa5b0f4357.tar.gz
kernel-qcow2-linux-b92af5a72ca982f0aa3df22f57a178aa5b0f4357.tar.xz
kernel-qcow2-linux-b92af5a72ca982f0aa3df22f57a178aa5b0f4357.zip
net/mlx5: Fix creating a new FTE when an existing but full FTE exists
Currently, when a flow steering rule is added, we look for a FTE with an identical value. If we find a match, we try to merge the required destinations with the existing ones. In a case where the existing destination list is full, the code should return an error to its consumer. However, the current code just tries to create another FTE. Fixing that by returning an error in this special scenario. Fixes: f478be79a22e ("net/mlx5: Add hash table for flow groups in flow table") Signed-off-by: Matan Barak <matanb@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 5a7bea688ec8..6ffe9251bf62 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -1449,7 +1449,7 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
int dest_num)
{
struct mlx5_flow_group *g;
- struct mlx5_flow_handle *rule = ERR_PTR(-ENOENT);
+ struct mlx5_flow_handle *rule;
struct rhlist_head *tmp, *list;
struct match_list {
struct list_head list;
@@ -1513,6 +1513,8 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
unlock_ref_node(&g->node);
}
+ rule = ERR_PTR(-ENOENT);
+
free_list:
if (!list_empty(&match_head)) {
struct match_list *match_tmp;
@@ -1553,7 +1555,7 @@ _mlx5_add_flow_rules(struct mlx5_flow_table *ft,
nested_lock_ref_node(&ft->node, FS_MUTEX_GRANDPARENT);
rule = try_add_to_existing_fg(ft, spec, flow_act, dest, dest_num);
- if (!IS_ERR(rule))
+ if (!IS_ERR(rule) || PTR_ERR(rule) != -ENOENT)
goto unlock;
g = create_autogroup(ft, spec->match_criteria_enable,