]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: E-switch, Set to legacy mode if failed to change switchdev mode
authorChris Mi <cmi@nvidia.com>
Thu, 3 Nov 2022 06:55:39 +0000 (23:55 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 16 Nov 2022 09:04:00 +0000 (10:04 +0100)
[ Upstream commit e12de39c07a7872c1ac7250311bb60b74ff29f25 ]

No need to rollback to the other mode because probably will fail
again. Just set to legacy mode and clear fdb table created flag.
So that fdb table will not be cleared again.

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>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 6aa58044b949bfe9c718f0464ece6f96215d0d46..4d8b8f6143cc94029ad1064555a470b76fd43224 100644 (file)
@@ -1388,12 +1388,14 @@ void mlx5_eswitch_disable_locked(struct mlx5_eswitch *esw)
                 esw->mode == MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS",
                 esw->esw_funcs.num_vfs, esw->enabled_vports);
 
-       esw->fdb_table.flags &= ~MLX5_ESW_FDB_CREATED;
-       if (esw->mode == MLX5_ESWITCH_OFFLOADS)
-               esw_offloads_disable(esw);
-       else if (esw->mode == MLX5_ESWITCH_LEGACY)
-               esw_legacy_disable(esw);
-       mlx5_esw_acls_ns_cleanup(esw);
+       if (esw->fdb_table.flags & MLX5_ESW_FDB_CREATED) {
+               esw->fdb_table.flags &= ~MLX5_ESW_FDB_CREATED;
+               if (esw->mode == MLX5_ESWITCH_OFFLOADS)
+                       esw_offloads_disable(esw);
+               else if (esw->mode == MLX5_ESWITCH_LEGACY)
+                       esw_legacy_disable(esw);
+               mlx5_esw_acls_ns_cleanup(esw);
+       }
 
        if (esw->mode == MLX5_ESWITCH_OFFLOADS)
                devl_rate_nodes_destroy(devlink);
index a9f4c652f859c770a65aee830139de7814d29631..3c68cac4a9c2c3abd56f78cffb26869d30ebe477 100644 (file)
@@ -2207,7 +2207,7 @@ out_free:
 static int esw_offloads_start(struct mlx5_eswitch *esw,
                              struct netlink_ext_ack *extack)
 {
-       int err, err1;
+       int err;
 
        esw->mode = MLX5_ESWITCH_OFFLOADS;
        err = mlx5_eswitch_enable_locked(esw, esw->dev->priv.sriov.num_vfs);
@@ -2215,11 +2215,6 @@ static int esw_offloads_start(struct mlx5_eswitch *esw,
                NL_SET_ERR_MSG_MOD(extack,
                                   "Failed setting eswitch to offloads");
                esw->mode = MLX5_ESWITCH_LEGACY;
-               err1 = mlx5_eswitch_enable_locked(esw, MLX5_ESWITCH_IGNORE_NUM_VFS);
-               if (err1) {
-                       NL_SET_ERR_MSG_MOD(extack,
-                                          "Failed setting eswitch back to legacy");
-               }
                mlx5_rescan_drivers(esw->dev);
        }
        if (esw->offloads.inline_mode == MLX5_INLINE_MODE_NONE) {
@@ -3272,19 +3267,12 @@ err_metadata:
 static int esw_offloads_stop(struct mlx5_eswitch *esw,
                             struct netlink_ext_ack *extack)
 {
-       int err, err1;
+       int err;
 
        esw->mode = MLX5_ESWITCH_LEGACY;
        err = mlx5_eswitch_enable_locked(esw, MLX5_ESWITCH_IGNORE_NUM_VFS);
-       if (err) {
+       if (err)
                NL_SET_ERR_MSG_MOD(extack, "Failed setting eswitch to legacy");
-               esw->mode = MLX5_ESWITCH_OFFLOADS;
-               err1 = mlx5_eswitch_enable_locked(esw, MLX5_ESWITCH_IGNORE_NUM_VFS);
-               if (err1) {
-                       NL_SET_ERR_MSG_MOD(extack,
-                                          "Failed setting eswitch back to offloads");
-               }
-       }
 
        return err;
 }