net/mlx5: Fix return value when searching for existing flow group
[ Upstream commit 8ec40e3f1f72bf8f8accf18020d487caa99f46a4 ]
When attempting to add a rule to an existing flow group, if a matching
flow group exists but is not active, the error code returned should be
EAGAIN, so that the rule can be added to the matching flow group once
it is active, rather than ENOENT, which indicates that no matching
flow group was found.
Fixes: bd71b08ec2
("net/mlx5: Support multiple updates of steering rules in parallel")
Signed-off-by: Gavi Teitz <gavi@nvidia.com>
Signed-off-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Patrisious Haddad <phaddad@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Link: https://patch.msgid.link/20250610151514.1094735-4-mbloch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5953ae44df
commit
a810e48477
@@ -1984,6 +1984,7 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
|
|||||||
struct mlx5_flow_handle *rule;
|
struct mlx5_flow_handle *rule;
|
||||||
struct match_list *iter;
|
struct match_list *iter;
|
||||||
bool take_write = false;
|
bool take_write = false;
|
||||||
|
bool try_again = false;
|
||||||
struct fs_fte *fte;
|
struct fs_fte *fte;
|
||||||
u64 version = 0;
|
u64 version = 0;
|
||||||
int err;
|
int err;
|
||||||
@@ -2043,6 +2044,7 @@ skip_search:
|
|||||||
nested_down_write_ref_node(&g->node, FS_LOCK_PARENT);
|
nested_down_write_ref_node(&g->node, FS_LOCK_PARENT);
|
||||||
|
|
||||||
if (!g->node.active) {
|
if (!g->node.active) {
|
||||||
|
try_again = true;
|
||||||
up_write_ref_node(&g->node, false);
|
up_write_ref_node(&g->node, false);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2064,7 +2066,8 @@ skip_search:
|
|||||||
tree_put_node(&fte->node, false);
|
tree_put_node(&fte->node, false);
|
||||||
return rule;
|
return rule;
|
||||||
}
|
}
|
||||||
rule = ERR_PTR(-ENOENT);
|
err = try_again ? -EAGAIN : -ENOENT;
|
||||||
|
rule = ERR_PTR(err);
|
||||||
out:
|
out:
|
||||||
kmem_cache_free(steering->ftes_cache, fte);
|
kmem_cache_free(steering->ftes_cache, fte);
|
||||||
return rule;
|
return rule;
|
||||||
|
Reference in New Issue
Block a user