| From dd163d8a8cf4935aaffd7cac49d55379daf56cca Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 26 Jul 2021 09:20:14 +0300 |
| Subject: net/mlx5: Fix flow table chaining |
| |
| From: Maor Gottlieb <maorg@nvidia.com> |
| |
| [ Upstream commit 8b54874ef1617185048029a3083d510569e93751 ] |
| |
| Fix a bug when flow table is created in priority that already |
| has other flow tables as shown in the below diagram. |
| If the new flow table (FT-B) has the lowest level in the priority, |
| we need to connect the flow tables from the previous priority (p0) |
| to this new table. In addition when this flow table is destroyed |
| (FT-B), we need to connect the flow tables from the previous |
| priority (p0) to the next level flow table (FT-C) in the same |
| priority of the destroyed table (if exists). |
| |
| --------- |
| |root_ns| |
| --------- |
| | |
| -------------------------------- |
| | | | |
| ---------- ---------- --------- |
| |p(prio)-x| | p-y | | p-n | |
| ---------- ---------- --------- |
| | | |
| ---------------- ------------------ |
| |ns(e.g bypass)| |ns(e.g. kernel) | |
| ---------------- ------------------ |
| | | | |
| ------- ------ ---- |
| | p0 | | p1 | |p2| |
| ------- ------ ---- |
| | | \ |
| -------- ------- ------ |
| | FT-A | |FT-B | |FT-C| |
| -------- ------- ------ |
| |
| Fixes: f90edfd279f3 ("net/mlx5_core: Connect flow tables") |
| Signed-off-by: Maor Gottlieb <maorg@nvidia.com> |
| Reviewed-by: Mark Bloch <mbloch@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 | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
| index 79fc5755735f..1d4b4e6f6fb4 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c |
| @@ -1024,17 +1024,19 @@ static int connect_fwd_rules(struct mlx5_core_dev *dev, |
| static int connect_flow_table(struct mlx5_core_dev *dev, struct mlx5_flow_table *ft, |
| struct fs_prio *prio) |
| { |
| - struct mlx5_flow_table *next_ft; |
| + struct mlx5_flow_table *next_ft, *first_ft; |
| int err = 0; |
| |
| /* Connect_prev_fts and update_root_ft_create are mutually exclusive */ |
| |
| - if (list_empty(&prio->node.children)) { |
| + first_ft = list_first_entry_or_null(&prio->node.children, |
| + struct mlx5_flow_table, node.list); |
| + if (!first_ft || first_ft->level > ft->level) { |
| err = connect_prev_fts(dev, ft, prio); |
| if (err) |
| return err; |
| |
| - next_ft = find_next_chained_ft(prio); |
| + next_ft = first_ft ? first_ft : find_next_chained_ft(prio); |
| err = connect_fwd_rules(dev, ft, next_ft); |
| if (err) |
| return err; |
| @@ -2113,7 +2115,7 @@ static int disconnect_flow_table(struct mlx5_flow_table *ft) |
| node.list) == ft)) |
| return 0; |
| |
| - next_ft = find_next_chained_ft(prio); |
| + next_ft = find_next_ft(ft); |
| err = connect_fwd_rules(dev, next_ft, ft); |
| if (err) |
| return err; |
| -- |
| 2.30.2 |
| |