net/mlx5: E-switch, Fix duplicate lag creation
authorChris Mi <cmi@nvidia.com>
Thu, 4 Aug 2022 02:09:07 +0000 (05:09 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 24 Nov 2022 08:03:21 +0000 (00:03 -0800)
If creating bond first and then enabling sriov in switchdev mode,
will hit the following syndrome:

mlx5_core 0000:08:00.0: mlx5_cmd_out_err:778:(pid 25543): CREATE_LAG(0x840) op_mod(0x0) failed, status bad parameter(0x3), syndrome (0x7d49cb), err(-22)

The reason is because the offending patch removes eswitch mode
none. In vf lag, the checking of eswitch mode none is replaced
by checking if sriov is enabled. But when driver enables sriov,
it triggers the bond workqueue task first and then setting sriov
number in pci_enable_sriov(). So the check fails.

Fix it by checking if sriov is enabled using eswitch internal
counter that is set before triggering the bond workqueue task.

Fixes: f019679ea5f2 ("net/mlx5: E-switch, Remove dependency between sriov and eswitch mode")
Signed-off-by: Chris Mi <cmi@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Vlad Buslov <vladbu@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c

index f68dc2d0dbe6598d923c564be7234b1e5724f79a..3029bc1c0dd04c073f48e13bcbcc5590a7ca8209 100644 (file)
@@ -736,6 +736,14 @@ void mlx5_eswitch_offloads_destroy_single_fdb(struct mlx5_eswitch *master_esw,
                                              struct mlx5_eswitch *slave_esw);
 int mlx5_eswitch_reload_reps(struct mlx5_eswitch *esw);
 
+static inline int mlx5_eswitch_num_vfs(struct mlx5_eswitch *esw)
+{
+       if (mlx5_esw_allowed(esw))
+               return esw->esw_funcs.num_vfs;
+
+       return 0;
+}
+
 #else  /* CONFIG_MLX5_ESWITCH */
 /* eswitch API stubs */
 static inline int  mlx5_eswitch_init(struct mlx5_core_dev *dev) { return 0; }
index be1307a63e6dd2df43d3c50f87a59468d5e4f17a..4070dc1d17cb8f41d2c85d192a7bf11b68f975fa 100644 (file)
@@ -701,8 +701,9 @@ static bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)
 
 #ifdef CONFIG_MLX5_ESWITCH
        dev = ldev->pf[MLX5_LAG_P1].dev;
-       if ((mlx5_sriov_is_enabled(dev)) && !is_mdev_switchdev_mode(dev))
-               return false;
+       for (i = 0; i  < ldev->ports; i++)
+               if (mlx5_eswitch_num_vfs(dev->priv.eswitch) && !is_mdev_switchdev_mode(dev))
+                       return false;
 
        mode = mlx5_eswitch_mode(dev);
        for (i = 0; i < ldev->ports; i++)