You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
6.9 KiB
195 lines
6.9 KiB
4 years ago
|
From a549a6c259fc46e49b55d5b7ce5ad1478d9a80b8 Mon Sep 17 00:00:00 2001
|
||
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Date: Sun, 10 May 2020 15:03:56 -0400
|
||
|
Subject: [PATCH 079/312] [netdrv] net/mlx5: E-switch, Prepare code to handle
|
||
|
vport enable error
|
||
|
|
||
|
Message-id: <20200510150452.10307-32-ahleihel@redhat.com>
|
||
|
Patchwork-id: 306655
|
||
|
Patchwork-instance: patchwork
|
||
|
O-Subject: [RHEL8.3 BZ 1789380 v2 31/87] net/mlx5: E-switch, Prepare code to handle vport enable error
|
||
|
Bugzilla: 1789380
|
||
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
||
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
||
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
||
|
RH-Acked-by: Jonathan Toppins <jtoppins@redhat.com>
|
||
|
|
||
|
Bugzilla: http://bugzilla.redhat.com/1789380
|
||
|
Upstream: v5.5-rc1
|
||
|
|
||
|
commit 925a6acc77a70f8b5bfd0df75e36557aa400b0a0
|
||
|
Author: Parav Pandit <parav@mellanox.com>
|
||
|
Date: Mon Oct 28 23:35:15 2019 +0000
|
||
|
|
||
|
net/mlx5: E-switch, Prepare code to handle vport enable error
|
||
|
|
||
|
In subsequent patch, esw_enable_vport() could fail and return error.
|
||
|
Prepare code to handle such error.
|
||
|
|
||
|
Signed-off-by: Parav Pandit <parav@mellanox.com>
|
||
|
Reviewed-by: Vu Pham <vuhuong@mellanox.com>
|
||
|
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
|
||
|
|
||
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
||
|
---
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 62 ++++++++++++++++------
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | 2 +-
|
||
|
.../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 5 +-
|
||
|
3 files changed, 50 insertions(+), 19 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
||
|
index 8067667fd59e..2ecb993545f9 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
|
||
|
@@ -443,6 +443,13 @@ static int esw_create_legacy_table(struct mlx5_eswitch *esw)
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
+static void esw_destroy_legacy_table(struct mlx5_eswitch *esw)
|
||
|
+{
|
||
|
+ esw_cleanup_vepa_rules(esw);
|
||
|
+ esw_destroy_legacy_fdb_table(esw);
|
||
|
+ esw_destroy_legacy_vepa_table(esw);
|
||
|
+}
|
||
|
+
|
||
|
#define MLX5_LEGACY_SRIOV_VPORT_EVENTS (MLX5_VPORT_UC_ADDR_CHANGE | \
|
||
|
MLX5_VPORT_MC_ADDR_CHANGE | \
|
||
|
MLX5_VPORT_PROMISC_CHANGE)
|
||
|
@@ -459,15 +466,10 @@ static int esw_legacy_enable(struct mlx5_eswitch *esw)
|
||
|
mlx5_esw_for_each_vf_vport(esw, i, vport, esw->esw_funcs.num_vfs)
|
||
|
vport->info.link_state = MLX5_VPORT_ADMIN_STATE_AUTO;
|
||
|
|
||
|
- mlx5_eswitch_enable_pf_vf_vports(esw, MLX5_LEGACY_SRIOV_VPORT_EVENTS);
|
||
|
- return 0;
|
||
|
-}
|
||
|
-
|
||
|
-static void esw_destroy_legacy_table(struct mlx5_eswitch *esw)
|
||
|
-{
|
||
|
- esw_cleanup_vepa_rules(esw);
|
||
|
- esw_destroy_legacy_fdb_table(esw);
|
||
|
- esw_destroy_legacy_vepa_table(esw);
|
||
|
+ ret = mlx5_eswitch_enable_pf_vf_vports(esw, MLX5_LEGACY_SRIOV_VPORT_EVENTS);
|
||
|
+ if (ret)
|
||
|
+ esw_destroy_legacy_table(esw);
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
static void esw_legacy_disable(struct mlx5_eswitch *esw)
|
||
|
@@ -1699,8 +1701,8 @@ static void esw_legacy_vport_destroy_drop_counters(struct mlx5_vport *vport)
|
||
|
mlx5_fc_destroy(dev, vport->egress.legacy.drop_counter);
|
||
|
}
|
||
|
|
||
|
-static void esw_enable_vport(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
|
||
|
- enum mlx5_eswitch_vport_event enabled_events)
|
||
|
+static int esw_enable_vport(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
|
||
|
+ enum mlx5_eswitch_vport_event enabled_events)
|
||
|
{
|
||
|
u16 vport_num = vport->vport;
|
||
|
|
||
|
@@ -1738,6 +1740,7 @@ static void esw_enable_vport(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
|
||
|
esw->enabled_vports++;
|
||
|
esw_debug(esw->dev, "Enabled VPORT(%d)\n", vport_num);
|
||
|
mutex_unlock(&esw->state_lock);
|
||
|
+ return 0;
|
||
|
}
|
||
|
|
||
|
static void esw_disable_vport(struct mlx5_eswitch *esw,
|
||
|
@@ -1862,26 +1865,51 @@ static void mlx5_eswitch_clear_vf_vports_info(struct mlx5_eswitch *esw)
|
||
|
/* mlx5_eswitch_enable_pf_vf_vports() enables vports of PF, ECPF and VFs
|
||
|
* whichever are present on the eswitch.
|
||
|
*/
|
||
|
-void
|
||
|
+int
|
||
|
mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
|
||
|
enum mlx5_eswitch_vport_event enabled_events)
|
||
|
{
|
||
|
struct mlx5_vport *vport;
|
||
|
+ int num_vfs;
|
||
|
+ int ret;
|
||
|
int i;
|
||
|
|
||
|
/* Enable PF vport */
|
||
|
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF);
|
||
|
- esw_enable_vport(esw, vport, enabled_events);
|
||
|
+ ret = esw_enable_vport(esw, vport, enabled_events);
|
||
|
+ if (ret)
|
||
|
+ return ret;
|
||
|
|
||
|
- /* Enable ECPF vports */
|
||
|
+ /* Enable ECPF vport */
|
||
|
if (mlx5_ecpf_vport_exists(esw->dev)) {
|
||
|
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF);
|
||
|
- esw_enable_vport(esw, vport, enabled_events);
|
||
|
+ ret = esw_enable_vport(esw, vport, enabled_events);
|
||
|
+ if (ret)
|
||
|
+ goto ecpf_err;
|
||
|
}
|
||
|
|
||
|
/* Enable VF vports */
|
||
|
- mlx5_esw_for_each_vf_vport(esw, i, vport, esw->esw_funcs.num_vfs)
|
||
|
- esw_enable_vport(esw, vport, enabled_events);
|
||
|
+ mlx5_esw_for_each_vf_vport(esw, i, vport, esw->esw_funcs.num_vfs) {
|
||
|
+ ret = esw_enable_vport(esw, vport, enabled_events);
|
||
|
+ if (ret)
|
||
|
+ goto vf_err;
|
||
|
+ }
|
||
|
+ return 0;
|
||
|
+
|
||
|
+vf_err:
|
||
|
+ num_vfs = i - 1;
|
||
|
+ mlx5_esw_for_each_vf_vport_reverse(esw, i, vport, num_vfs)
|
||
|
+ esw_disable_vport(esw, vport);
|
||
|
+
|
||
|
+ if (mlx5_ecpf_vport_exists(esw->dev)) {
|
||
|
+ vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF);
|
||
|
+ esw_disable_vport(esw, vport);
|
||
|
+ }
|
||
|
+
|
||
|
+ecpf_err:
|
||
|
+ vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF);
|
||
|
+ esw_disable_vport(esw, vport);
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
/* mlx5_eswitch_disable_pf_vf_vports() disables vports of PF, ECPF and VFs
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
||
|
index f12d446e2c87..d29df0c302f2 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
||
|
@@ -626,7 +626,7 @@ bool mlx5_eswitch_is_vf_vport(const struct mlx5_eswitch *esw, u16 vport_num);
|
||
|
void mlx5_eswitch_update_num_of_vfs(struct mlx5_eswitch *esw, const int num_vfs);
|
||
|
int mlx5_esw_funcs_changed_handler(struct notifier_block *nb, unsigned long type, void *data);
|
||
|
|
||
|
-void
|
||
|
+int
|
||
|
mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
|
||
|
enum mlx5_eswitch_vport_event enabled_events);
|
||
|
void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw);
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
||
|
index 00d126fa6e02..b33543c5f68f 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
||
|
@@ -2158,7 +2158,9 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
|
||
|
mlx5_esw_for_each_vf_vport(esw, i, vport, esw->esw_funcs.num_vfs)
|
||
|
vport->info.link_state = MLX5_VPORT_ADMIN_STATE_DOWN;
|
||
|
|
||
|
- mlx5_eswitch_enable_pf_vf_vports(esw, MLX5_VPORT_UC_ADDR_CHANGE);
|
||
|
+ err = mlx5_eswitch_enable_pf_vf_vports(esw, MLX5_VPORT_UC_ADDR_CHANGE);
|
||
|
+ if (err)
|
||
|
+ goto err_vports;
|
||
|
|
||
|
err = esw_offloads_load_all_reps(esw);
|
||
|
if (err)
|
||
|
@@ -2171,6 +2173,7 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
|
||
|
|
||
|
err_reps:
|
||
|
mlx5_eswitch_disable_pf_vf_vports(esw);
|
||
|
+err_vports:
|
||
|
esw_set_passing_vport_metadata(esw, false);
|
||
|
err_vport_metadata:
|
||
|
esw_offloads_steering_cleanup(esw);
|
||
|
--
|
||
|
2.13.6
|
||
|
|