[PATCH net-next 04/15] net/mlx5: LAG, treat virt LAG as a software managed LAG
From: Tariq Toukan
Date: Tue Nov 03 2026 - 13:02:25 EST
From: Shay Drory <shayd@xxxxxxxxxx>
mlx5_lag_is_sw_managed() (renamed from mlx5_lag_is_sw_lag()) marks the
LAG paths the driver builds in software - the LAG demux and vport-LAG -
which must skip the FW vport-LAG commands. A virt LAG is
software-managed like an SD LAG.
In the same manner, block multipath LAG over virt LAG as well.
Signed-off-by: Shay Drory <shayd@xxxxxxxxxx>
Reviewed-by: Moshe Shemesh <moshe@xxxxxxxxxx>
Reviewed-by: Mark Bloch <mbloch@xxxxxxxxxx>
Signed-off-by: Tariq Toukan <tariqt@xxxxxxxxxx>
---
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 12 +++++++-----
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h | 1 +
drivers/net/ethernet/mellanox/mlx5/core/lag/mp.c | 4 ++--
3 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c b/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c
index 46f125d24f15..b2ac5c671ae6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c
@@ -173,9 +173,11 @@ static u32 mlx5_lag_dev_group_id(struct mlx5_core_dev *dev)
return 0;
}
-static int mlx5_lag_is_sw_lag(struct mlx5_core_dev *dev)
+bool mlx5_lag_is_sw_managed(struct mlx5_core_dev *dev)
{
- return mlx5_lag_is_sd(dev);
+ struct mlx5_lag *ldev = mlx5_lag_dev(dev);
+
+ return mlx5_lag_is_sd(dev) || (ldev && ldev->virt_lag);
}
int mlx5_cmd_create_vport_lag(struct mlx5_core_dev *dev)
@@ -184,7 +186,7 @@ int mlx5_cmd_create_vport_lag(struct mlx5_core_dev *dev)
struct mlx5_lag *ldev = mlx5_lag_dev(dev);
int ret;
- if (mlx5_lag_is_sw_lag(dev)) {
+ if (mlx5_lag_is_sw_managed(dev)) {
if (!ldev)
return -ENODEV;
@@ -206,7 +208,7 @@ int mlx5_cmd_destroy_vport_lag(struct mlx5_core_dev *dev)
u32 in[MLX5_ST_SZ_DW(destroy_vport_lag_in)] = {};
struct mlx5_lag *ldev = mlx5_lag_dev(dev);
- if (mlx5_lag_is_sw_lag(dev)) {
+ if (mlx5_lag_is_sw_managed(dev)) {
if (!ldev)
return 0;
@@ -1912,7 +1914,7 @@ int mlx5_lag_demux_init(struct mlx5_core_dev *dev,
xa_init(&pf->lag_demux_rules);
- if (mlx5_lag_is_sw_lag(dev))
+ if (mlx5_lag_is_sw_managed(dev))
return mlx5_lag_demux_ft_fg_init(dev, ft_attr, pf);
return mlx5_lag_demux_fw_init(dev, ft_attr, pf);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h b/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h
index dff04f40d8f3..872cc769297c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lag/lag.h
@@ -229,6 +229,7 @@ bool mlx5_lag_check_prereq(struct mlx5_lag *ldev);
void mlx5_virt_lag_mark_master(struct mlx5_lag *ldev);
void mlx5_lag_clear_master(struct mlx5_lag *ldev);
bool mlx5_lag_is_sd(struct mlx5_core_dev *dev);
+bool mlx5_lag_is_sw_managed(struct mlx5_core_dev *dev);
int mlx5_lag_demux_init(struct mlx5_core_dev *dev,
struct mlx5_flow_table_attr *ft_attr);
void mlx5_lag_demux_cleanup(struct mlx5_core_dev *dev);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag/mp.c b/drivers/net/ethernet/mellanox/mlx5/core/lag/mp.c
index 65c76bd748c6..2077fc5d80c7 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lag/mp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lag/mp.c
@@ -26,8 +26,8 @@ static bool mlx5_lag_multipath_check_prereq(struct mlx5_lag *ldev)
if (__mlx5_lag_is_active(ldev) && !__mlx5_lag_is_multipath(ldev))
return false;
- if (__mlx5_lag_is_sd(ldev, mlx5_lag_pf(ldev, idx0)->dev) ||
- __mlx5_lag_is_sd(ldev, mlx5_lag_pf(ldev, idx1)->dev))
+ if (mlx5_lag_is_sw_managed(mlx5_lag_pf(ldev, idx0)->dev) ||
+ mlx5_lag_is_sw_managed(mlx5_lag_pf(ldev, idx1)->dev))
return false;
if (ldev->ports > MLX5_LAG_MULTIPATH_OFFLOADS_SUPPORTED_PORTS)
--
2.44.0