Skip to content

Commit 3441346

Browse files
BodongWangdavem330
authored andcommitted
mlx5/core: E-Switch, Create ACL FT for eswitch manager in switchdev mode
ACL flow table is required in switchdev mode when metadata is enabled, driver creates such table when loading each vport. However, not every vport is loaded in switchdev mode. Such as ECPF if it's the eswitch manager. In this case, ACL flow table is still needed. To make it modularized, create ACL flow table for eswitch manager as default and skip such operations when loading manager vport. Also, there is no need to load the eswitch manager vport in switchdev mode. This means there is no need to load it on regular connect-x HCAs where the PF is the eswitch manager. This will avoid creating duplicate ACL flow table for host PF vport. Fixes: 29bcb6e ("net/mlx5e: E-Switch, Use metadata for vport matching in send-to-vport rules") Fixes: eb8e9fa ("mlx5/core: E-Switch, Allocate ECPF vport if it's an eswitch manager") Fixes: 5019833 ("net/mlx5: E-switch, Introduce helper function to enable/disable vports") Signed-off-by: Bodong Wang <bodong@nvidia.com> Reviewed-by: Mark Bloch <mbloch@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent b7558a7 commit 3441346

File tree

2 files changed

+51
-19
lines changed

2 files changed

+51
-19
lines changed

drivers/net/ethernet/mellanox/mlx5/core/eswitch.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,12 +1276,19 @@ int
12761276
mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
12771277
enum mlx5_eswitch_vport_event enabled_events)
12781278
{
1279+
bool pf_needed;
12791280
int ret;
12801281

1282+
pf_needed = mlx5_core_is_ecpf_esw_manager(esw->dev) ||
1283+
esw->mode == MLX5_ESWITCH_LEGACY;
1284+
12811285
/* Enable PF vport */
1282-
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_PF, enabled_events);
1283-
if (ret)
1284-
return ret;
1286+
if (pf_needed) {
1287+
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_PF,
1288+
enabled_events);
1289+
if (ret)
1290+
return ret;
1291+
}
12851292

12861293
/* Enable external host PF HCA */
12871294
ret = host_pf_enable_hca(esw->dev);
@@ -1317,7 +1324,8 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
13171324
ecpf_err:
13181325
host_pf_disable_hca(esw->dev);
13191326
pf_hca_err:
1320-
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
1327+
if (pf_needed)
1328+
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
13211329
return ret;
13221330
}
13231331

@@ -1335,7 +1343,10 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw)
13351343
}
13361344

13371345
host_pf_disable_hca(esw->dev);
1338-
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
1346+
1347+
if (mlx5_core_is_ecpf_esw_manager(esw->dev) ||
1348+
esw->mode == MLX5_ESWITCH_LEGACY)
1349+
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
13391350
}
13401351

13411352
static void mlx5_eswitch_get_devlink_param(struct mlx5_eswitch *esw)

drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3216,26 +3216,47 @@ esw_vport_destroy_offloads_acl_tables(struct mlx5_eswitch *esw,
32163216
esw_acl_ingress_ofld_cleanup(esw, vport);
32173217
}
32183218

3219-
static int esw_create_uplink_offloads_acl_tables(struct mlx5_eswitch *esw)
3219+
static int esw_create_offloads_acl_tables(struct mlx5_eswitch *esw)
32203220
{
3221-
struct mlx5_vport *vport;
3221+
struct mlx5_vport *uplink, *manager;
3222+
int ret;
32223223

3223-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_UPLINK);
3224-
if (IS_ERR(vport))
3225-
return PTR_ERR(vport);
3224+
uplink = mlx5_eswitch_get_vport(esw, MLX5_VPORT_UPLINK);
3225+
if (IS_ERR(uplink))
3226+
return PTR_ERR(uplink);
3227+
3228+
ret = esw_vport_create_offloads_acl_tables(esw, uplink);
3229+
if (ret)
3230+
return ret;
3231+
3232+
manager = mlx5_eswitch_get_vport(esw, esw->manager_vport);
3233+
if (IS_ERR(manager)) {
3234+
ret = PTR_ERR(manager);
3235+
goto err_manager;
3236+
}
32263237

3227-
return esw_vport_create_offloads_acl_tables(esw, vport);
3238+
ret = esw_vport_create_offloads_acl_tables(esw, manager);
3239+
if (ret)
3240+
goto err_manager;
3241+
3242+
return 0;
3243+
3244+
err_manager:
3245+
esw_vport_destroy_offloads_acl_tables(esw, uplink);
3246+
return ret;
32283247
}
32293248

3230-
static void esw_destroy_uplink_offloads_acl_tables(struct mlx5_eswitch *esw)
3249+
static void esw_destroy_offloads_acl_tables(struct mlx5_eswitch *esw)
32313250
{
32323251
struct mlx5_vport *vport;
32333252

3234-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_UPLINK);
3235-
if (IS_ERR(vport))
3236-
return;
3253+
vport = mlx5_eswitch_get_vport(esw, esw->manager_vport);
3254+
if (!IS_ERR(vport))
3255+
esw_vport_destroy_offloads_acl_tables(esw, vport);
32373256

3238-
esw_vport_destroy_offloads_acl_tables(esw, vport);
3257+
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_UPLINK);
3258+
if (!IS_ERR(vport))
3259+
esw_vport_destroy_offloads_acl_tables(esw, vport);
32393260
}
32403261

32413262
int mlx5_eswitch_reload_reps(struct mlx5_eswitch *esw)
@@ -3280,7 +3301,7 @@ static int esw_offloads_steering_init(struct mlx5_eswitch *esw)
32803301
}
32813302
esw->fdb_table.offloads.indir = indir;
32823303

3283-
err = esw_create_uplink_offloads_acl_tables(esw);
3304+
err = esw_create_offloads_acl_tables(esw);
32843305
if (err)
32853306
goto create_acl_err;
32863307

@@ -3321,7 +3342,7 @@ static int esw_offloads_steering_init(struct mlx5_eswitch *esw)
33213342
create_restore_err:
33223343
esw_destroy_offloads_table(esw);
33233344
create_offloads_err:
3324-
esw_destroy_uplink_offloads_acl_tables(esw);
3345+
esw_destroy_offloads_acl_tables(esw);
33253346
create_acl_err:
33263347
mlx5_esw_indir_table_destroy(esw->fdb_table.offloads.indir);
33273348
create_indir_err:
@@ -3337,7 +3358,7 @@ static void esw_offloads_steering_cleanup(struct mlx5_eswitch *esw)
33373358
esw_destroy_offloads_fdb_tables(esw);
33383359
esw_destroy_restore_table(esw);
33393360
esw_destroy_offloads_table(esw);
3340-
esw_destroy_uplink_offloads_acl_tables(esw);
3361+
esw_destroy_offloads_acl_tables(esw);
33413362
mlx5_esw_indir_table_destroy(esw->fdb_table.offloads.indir);
33423363
mutex_destroy(&esw->fdb_table.offloads.vports.lock);
33433364
}

0 commit comments

Comments
 (0)