]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: LAG, disable both regular and SD LAG on lag_disable_change
authorShay Drory <shayd@nvidia.com>
Fri, 12 Jun 2026 11:38:59 +0000 (14:38 +0300)
committerJakub Kicinski <kuba@kernel.org>
Mon, 15 Jun 2026 18:40:50 +0000 (11:40 -0700)
Extend mlx5_lag_disable_change() to properly disable both regular LAG
and SD LAG when requested. Each LAG type uses its own devcom component
for locking.

Use mlx5_sd_get_devcom() helper to retrieve the SD devcom component,
needed for proper locking when disabling SD LAG.

Signed-off-by: Shay Drory <shayd@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260612113904.537595-11-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c

index e23c1e81b98fa385befae7ac3ab0e18367fe93cf..84eff995cad1e1e8f79f7567481b836e50ee5dca 100644 (file)
@@ -2494,13 +2494,22 @@ EXPORT_SYMBOL(mlx5_lag_is_shared_fdb);
 
 void mlx5_lag_disable_change(struct mlx5_core_dev *dev)
 {
+       struct mlx5_devcom_comp_dev *sd_devcom = mlx5_sd_get_devcom(dev);
+       struct mlx5_core_dev *primary = dev;
        struct mlx5_lag *ldev;
+       struct lag_func *pf;
+       int i;
 
        ldev = mlx5_lag_dev(dev);
        if (!ldev)
                return;
 
-       mlx5_devcom_comp_lock(dev->priv.hca_devcom_comp);
+       if (sd_devcom) {
+               mlx5_devcom_comp_lock(sd_devcom);
+               primary = mlx5_sd_get_primary(dev) ?: dev;
+               mlx5_devcom_comp_unlock(sd_devcom);
+       }
+       mlx5_devcom_comp_lock(primary->priv.hca_devcom_comp);
        mutex_lock(&ldev->lock);
 
        ldev->mode_changes_in_progress++;
@@ -2512,7 +2521,23 @@ void mlx5_lag_disable_change(struct mlx5_core_dev *dev)
        }
 
        mutex_unlock(&ldev->lock);
-       mlx5_devcom_comp_unlock(dev->priv.hca_devcom_comp);
+       mlx5_devcom_comp_unlock(primary->priv.hca_devcom_comp);
+
+       if (!sd_devcom)
+               return;
+
+       /* Teardown SD shared FDB for this device's group if active */
+       mlx5_devcom_comp_lock(sd_devcom);
+       mutex_lock(&ldev->lock);
+       mlx5_lag_for_each(i, 0, ldev, MLX5_LAG_FILTER_ALL) {
+               pf = mlx5_lag_pf(ldev, i);
+               if (pf->dev == dev && pf->sd_fdb_active) {
+                       mlx5_lag_shared_fdb_destroy(ldev, pf->group_id);
+                       break;
+               }
+       }
+       mutex_unlock(&ldev->lock);
+       mlx5_devcom_comp_unlock(sd_devcom);
 }
 
 void mlx5_lag_enable_change(struct mlx5_core_dev *dev)