]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5: LAG, disable MPESW in lag_disable_change()
authorShay Drory <shayd@nvidia.com>
Tue, 24 Feb 2026 11:46:49 +0000 (13:46 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 26 Feb 2026 04:01:44 +0000 (20:01 -0800)
mlx5_lag_disable_change() unconditionally called mlx5_disable_lag() when
LAG was active, which is incorrect for MLX5_LAG_MODE_MPESW.
Hnece, call mlx5_disable_mpesw() when running in MPESW mode.

Fixes: a32327a3a02c ("net/mlx5: Lag, Control MultiPort E-Switch single FDB mode")
Signed-off-by: Shay Drory <shayd@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260224114652.1787431-3-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c
drivers/net/ethernet/mellanox/mlx5/core/lag/mpesw.c
drivers/net/ethernet/mellanox/mlx5/core/lag/mpesw.h

index 9fe47c836ebd3e373aaddb55699a435e83e58dba..859f042caf79aad77ad9a4fca9981d8a02cc4ed1 100644 (file)
@@ -1869,8 +1869,12 @@ void mlx5_lag_disable_change(struct mlx5_core_dev *dev)
        mutex_lock(&ldev->lock);
 
        ldev->mode_changes_in_progress++;
-       if (__mlx5_lag_is_active(ldev))
-               mlx5_disable_lag(ldev);
+       if (__mlx5_lag_is_active(ldev)) {
+               if (ldev->mode == MLX5_LAG_MODE_MPESW)
+                       mlx5_lag_disable_mpesw(ldev);
+               else
+                       mlx5_disable_lag(ldev);
+       }
 
        mutex_unlock(&ldev->lock);
        mlx5_devcom_comp_unlock(dev->priv.hca_devcom_comp);
index 04762562d7d9b3a369bf15ca4f001b5c638aa988..a63d48d18878e1cea5c0801092e62478a29b43a7 100644 (file)
@@ -65,7 +65,7 @@ err_metadata:
        return err;
 }
 
-static int enable_mpesw(struct mlx5_lag *ldev)
+static int mlx5_lag_enable_mpesw(struct mlx5_lag *ldev)
 {
        struct mlx5_core_dev *dev0;
        int err;
@@ -126,7 +126,7 @@ err_add_devices:
        return err;
 }
 
-static void disable_mpesw(struct mlx5_lag *ldev)
+void mlx5_lag_disable_mpesw(struct mlx5_lag *ldev)
 {
        if (ldev->mode == MLX5_LAG_MODE_MPESW) {
                mlx5_mpesw_metadata_cleanup(ldev);
@@ -152,9 +152,9 @@ static void mlx5_mpesw_work(struct work_struct *work)
        }
 
        if (mpesww->op == MLX5_MPESW_OP_ENABLE)
-               mpesww->result = enable_mpesw(ldev);
+               mpesww->result = mlx5_lag_enable_mpesw(ldev);
        else if (mpesww->op == MLX5_MPESW_OP_DISABLE)
-               disable_mpesw(ldev);
+               mlx5_lag_disable_mpesw(ldev);
 unlock:
        mutex_unlock(&ldev->lock);
        mlx5_devcom_comp_unlock(devcom);
index f5d9b5c97b0da83702be56f7a0886e6eef496259..b767dbb4f4571520971bb30ac9be4ccfdcb743ec 100644 (file)
@@ -31,6 +31,11 @@ int mlx5_lag_mpesw_do_mirred(struct mlx5_core_dev *mdev,
 bool mlx5_lag_is_mpesw(struct mlx5_core_dev *dev);
 void mlx5_lag_mpesw_disable(struct mlx5_core_dev *dev);
 int mlx5_lag_mpesw_enable(struct mlx5_core_dev *dev);
+#ifdef CONFIG_MLX5_ESWITCH
+void mlx5_lag_disable_mpesw(struct mlx5_lag *ldev);
+#else
+static inline void mlx5_lag_disable_mpesw(struct mlx5_lag *ldev) {}
+#endif /* CONFIG_MLX5_ESWITCH */
 
 #ifdef CONFIG_MLX5_ESWITCH
 void mlx5_mpesw_speed_update_work(struct work_struct *work);