Skip to content

Commit 2ec1ba5

Browse files
Shahar Shitritopsiff
authored andcommitted
net/mlx5: E-Switch, Fix peer miss rules to use peer eswitch
[ Upstream commit 5b4c56ad4da0aa00b258ab50b1f5775b7d3108c7 ] In the original design, it is assumed local and peer eswitches have the same number of vfs. However, in new firmware, local and peer eswitches can have different number of vfs configured by mlxconfig. In such configuration, it is incorrect to derive the number of vfs from the local device's eswitch. Fix this by updating the peer miss rules add and delete functions to use the peer device's eswitch and vf count instead of the local device's information, ensuring correct behavior regardless of vf configuration differences. Fixes: ac004b8 ("net/mlx5e: E-Switch, Add peer miss rules") Signed-off-by: Shahar Shitrit <[email protected]> Reviewed-by: Mark Bloch <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit e4ca597d3116ff2f1226a3bf777c4e91debc3727)
1 parent dd934cb commit 2ec1ba5

File tree

1 file changed

+54
-54
lines changed

1 file changed

+54
-54
lines changed

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

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,19 +1170,19 @@ static void esw_set_peer_miss_rule_source_port(struct mlx5_eswitch *esw,
11701170
static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
11711171
struct mlx5_core_dev *peer_dev)
11721172
{
1173+
struct mlx5_eswitch *peer_esw = peer_dev->priv.eswitch;
11731174
struct mlx5_flow_destination dest = {};
11741175
struct mlx5_flow_act flow_act = {0};
11751176
struct mlx5_flow_handle **flows;
1176-
/* total vports is the same for both e-switches */
1177-
int nvports = esw->total_vports;
11781177
struct mlx5_flow_handle *flow;
1178+
struct mlx5_vport *peer_vport;
11791179
struct mlx5_flow_spec *spec;
1180-
struct mlx5_vport *vport;
11811180
int err, pfindex;
11821181
unsigned long i;
11831182
void *misc;
11841183

1185-
if (!MLX5_VPORT_MANAGER(esw->dev) && !mlx5_core_is_ecpf_esw_manager(esw->dev))
1184+
if (!MLX5_VPORT_MANAGER(peer_dev) &&
1185+
!mlx5_core_is_ecpf_esw_manager(peer_dev))
11861186
return 0;
11871187

11881188
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
@@ -1191,7 +1191,7 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
11911191

11921192
peer_miss_rules_setup(esw, peer_dev, spec, &dest);
11931193

1194-
flows = kvcalloc(nvports, sizeof(*flows), GFP_KERNEL);
1194+
flows = kvcalloc(peer_esw->total_vports, sizeof(*flows), GFP_KERNEL);
11951195
if (!flows) {
11961196
err = -ENOMEM;
11971197
goto alloc_flows_err;
@@ -1201,59 +1201,60 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12011201
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value,
12021202
misc_parameters);
12031203

1204-
if (mlx5_core_is_ecpf_esw_manager(esw->dev)) {
1205-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF);
1206-
esw_set_peer_miss_rule_source_port(esw, peer_dev->priv.eswitch,
1207-
spec, MLX5_VPORT_PF);
1204+
if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
1205+
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
1206+
esw_set_peer_miss_rule_source_port(esw, peer_esw, spec,
1207+
MLX5_VPORT_PF);
12081208

12091209
flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
12101210
spec, &flow_act, &dest, 1);
12111211
if (IS_ERR(flow)) {
12121212
err = PTR_ERR(flow);
12131213
goto add_pf_flow_err;
12141214
}
1215-
flows[vport->index] = flow;
1215+
flows[peer_vport->index] = flow;
12161216
}
12171217

1218-
if (mlx5_ecpf_vport_exists(esw->dev)) {
1219-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF);
1218+
if (mlx5_ecpf_vport_exists(peer_dev)) {
1219+
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_ECPF);
12201220
MLX5_SET(fte_match_set_misc, misc, source_port, MLX5_VPORT_ECPF);
12211221
flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
12221222
spec, &flow_act, &dest, 1);
12231223
if (IS_ERR(flow)) {
12241224
err = PTR_ERR(flow);
12251225
goto add_ecpf_flow_err;
12261226
}
1227-
flows[vport->index] = flow;
1227+
flows[peer_vport->index] = flow;
12281228
}
12291229

1230-
mlx5_esw_for_each_vf_vport(esw, i, vport, mlx5_core_max_vfs(esw->dev)) {
1230+
mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
1231+
mlx5_core_max_vfs(peer_dev)) {
12311232
esw_set_peer_miss_rule_source_port(esw,
1232-
peer_dev->priv.eswitch,
1233-
spec, vport->vport);
1233+
peer_esw,
1234+
spec, peer_vport->vport);
12341235

12351236
flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
12361237
spec, &flow_act, &dest, 1);
12371238
if (IS_ERR(flow)) {
12381239
err = PTR_ERR(flow);
12391240
goto add_vf_flow_err;
12401241
}
1241-
flows[vport->index] = flow;
1242+
flows[peer_vport->index] = flow;
12421243
}
12431244

1244-
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
1245-
mlx5_esw_for_each_ec_vf_vport(esw, i, vport, mlx5_core_max_ec_vfs(esw->dev)) {
1246-
if (i >= mlx5_core_max_ec_vfs(peer_dev))
1247-
break;
1248-
esw_set_peer_miss_rule_source_port(esw, peer_dev->priv.eswitch,
1249-
spec, vport->vport);
1245+
if (mlx5_core_ec_sriov_enabled(peer_dev)) {
1246+
mlx5_esw_for_each_ec_vf_vport(peer_esw, i, peer_vport,
1247+
mlx5_core_max_ec_vfs(peer_dev)) {
1248+
esw_set_peer_miss_rule_source_port(esw, peer_esw,
1249+
spec,
1250+
peer_vport->vport);
12501251
flow = mlx5_add_flow_rules(esw->fdb_table.offloads.slow_fdb,
12511252
spec, &flow_act, &dest, 1);
12521253
if (IS_ERR(flow)) {
12531254
err = PTR_ERR(flow);
12541255
goto add_ec_vf_flow_err;
12551256
}
1256-
flows[vport->index] = flow;
1257+
flows[peer_vport->index] = flow;
12571258
}
12581259
}
12591260

@@ -1270,25 +1271,27 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12701271
return 0;
12711272

12721273
add_ec_vf_flow_err:
1273-
mlx5_esw_for_each_ec_vf_vport(esw, i, vport, mlx5_core_max_ec_vfs(esw->dev)) {
1274-
if (!flows[vport->index])
1274+
mlx5_esw_for_each_ec_vf_vport(peer_esw, i, peer_vport,
1275+
mlx5_core_max_ec_vfs(peer_dev)) {
1276+
if (!flows[peer_vport->index])
12751277
continue;
1276-
mlx5_del_flow_rules(flows[vport->index]);
1278+
mlx5_del_flow_rules(flows[peer_vport->index]);
12771279
}
12781280
add_vf_flow_err:
1279-
mlx5_esw_for_each_vf_vport(esw, i, vport, mlx5_core_max_vfs(esw->dev)) {
1280-
if (!flows[vport->index])
1281+
mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
1282+
mlx5_core_max_vfs(peer_dev)) {
1283+
if (!flows[peer_vport->index])
12811284
continue;
1282-
mlx5_del_flow_rules(flows[vport->index]);
1285+
mlx5_del_flow_rules(flows[peer_vport->index]);
12831286
}
1284-
if (mlx5_ecpf_vport_exists(esw->dev)) {
1285-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF);
1286-
mlx5_del_flow_rules(flows[vport->index]);
1287+
if (mlx5_ecpf_vport_exists(peer_dev)) {
1288+
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_ECPF);
1289+
mlx5_del_flow_rules(flows[peer_vport->index]);
12871290
}
12881291
add_ecpf_flow_err:
1289-
if (mlx5_core_is_ecpf_esw_manager(esw->dev)) {
1290-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF);
1291-
mlx5_del_flow_rules(flows[vport->index]);
1292+
if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
1293+
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
1294+
mlx5_del_flow_rules(flows[peer_vport->index]);
12921295
}
12931296
add_pf_flow_err:
12941297
esw_warn(esw->dev, "FDB: Failed to add peer miss flow rule err %d\n", err);
@@ -1301,37 +1304,34 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
13011304
static void esw_del_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
13021305
struct mlx5_core_dev *peer_dev)
13031306
{
1307+
struct mlx5_eswitch *peer_esw = peer_dev->priv.eswitch;
13041308
u16 peer_index = mlx5_get_dev_index(peer_dev);
13051309
struct mlx5_flow_handle **flows;
1306-
struct mlx5_vport *vport;
1310+
struct mlx5_vport *peer_vport;
13071311
unsigned long i;
13081312

13091313
flows = esw->fdb_table.offloads.peer_miss_rules[peer_index];
13101314
if (!flows)
13111315
return;
13121316

1313-
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
1314-
mlx5_esw_for_each_ec_vf_vport(esw, i, vport, mlx5_core_max_ec_vfs(esw->dev)) {
1315-
/* The flow for a particular vport could be NULL if the other ECPF
1316-
* has fewer or no VFs enabled
1317-
*/
1318-
if (!flows[vport->index])
1319-
continue;
1320-
mlx5_del_flow_rules(flows[vport->index]);
1321-
}
1317+
if (mlx5_core_ec_sriov_enabled(peer_dev)) {
1318+
mlx5_esw_for_each_ec_vf_vport(peer_esw, i, peer_vport,
1319+
mlx5_core_max_ec_vfs(peer_dev))
1320+
mlx5_del_flow_rules(flows[peer_vport->index]);
13221321
}
13231322

1324-
mlx5_esw_for_each_vf_vport(esw, i, vport, mlx5_core_max_vfs(esw->dev))
1325-
mlx5_del_flow_rules(flows[vport->index]);
1323+
mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
1324+
mlx5_core_max_vfs(peer_dev))
1325+
mlx5_del_flow_rules(flows[peer_vport->index]);
13261326

1327-
if (mlx5_ecpf_vport_exists(esw->dev)) {
1328-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_ECPF);
1329-
mlx5_del_flow_rules(flows[vport->index]);
1327+
if (mlx5_ecpf_vport_exists(peer_dev)) {
1328+
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_ECPF);
1329+
mlx5_del_flow_rules(flows[peer_vport->index]);
13301330
}
13311331

1332-
if (mlx5_core_is_ecpf_esw_manager(esw->dev)) {
1333-
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF);
1334-
mlx5_del_flow_rules(flows[vport->index]);
1332+
if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
1333+
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
1334+
mlx5_del_flow_rules(flows[peer_vport->index]);
13351335
}
13361336

13371337
kvfree(flows);

0 commit comments

Comments
 (0)