@@ -1170,19 +1170,19 @@ static void esw_set_peer_miss_rule_source_port(struct mlx5_eswitch *esw,
1170
1170
static int esw_add_fdb_peer_miss_rules (struct mlx5_eswitch * esw ,
1171
1171
struct mlx5_core_dev * peer_dev )
1172
1172
{
1173
+ struct mlx5_eswitch * peer_esw = peer_dev -> priv .eswitch ;
1173
1174
struct mlx5_flow_destination dest = {};
1174
1175
struct mlx5_flow_act flow_act = {0 };
1175
1176
struct mlx5_flow_handle * * flows ;
1176
- /* total vports is the same for both e-switches */
1177
- int nvports = esw -> total_vports ;
1178
1177
struct mlx5_flow_handle * flow ;
1178
+ struct mlx5_vport * peer_vport ;
1179
1179
struct mlx5_flow_spec * spec ;
1180
- struct mlx5_vport * vport ;
1181
1180
int err , pfindex ;
1182
1181
unsigned long i ;
1183
1182
void * misc ;
1184
1183
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 ))
1186
1186
return 0 ;
1187
1187
1188
1188
spec = kvzalloc (sizeof (* spec ), GFP_KERNEL );
@@ -1191,7 +1191,7 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
1191
1191
1192
1192
peer_miss_rules_setup (esw , peer_dev , spec , & dest );
1193
1193
1194
- flows = kvcalloc (nvports , sizeof (* flows ), GFP_KERNEL );
1194
+ flows = kvcalloc (peer_esw -> total_vports , sizeof (* flows ), GFP_KERNEL );
1195
1195
if (!flows ) {
1196
1196
err = - ENOMEM ;
1197
1197
goto alloc_flows_err ;
@@ -1201,59 +1201,60 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
1201
1201
misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value ,
1202
1202
misc_parameters );
1203
1203
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 );
1208
1208
1209
1209
flow = mlx5_add_flow_rules (mlx5_eswitch_get_slow_fdb (esw ),
1210
1210
spec , & flow_act , & dest , 1 );
1211
1211
if (IS_ERR (flow )) {
1212
1212
err = PTR_ERR (flow );
1213
1213
goto add_pf_flow_err ;
1214
1214
}
1215
- flows [vport -> index ] = flow ;
1215
+ flows [peer_vport -> index ] = flow ;
1216
1216
}
1217
1217
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 );
1220
1220
MLX5_SET (fte_match_set_misc , misc , source_port , MLX5_VPORT_ECPF );
1221
1221
flow = mlx5_add_flow_rules (mlx5_eswitch_get_slow_fdb (esw ),
1222
1222
spec , & flow_act , & dest , 1 );
1223
1223
if (IS_ERR (flow )) {
1224
1224
err = PTR_ERR (flow );
1225
1225
goto add_ecpf_flow_err ;
1226
1226
}
1227
- flows [vport -> index ] = flow ;
1227
+ flows [peer_vport -> index ] = flow ;
1228
1228
}
1229
1229
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 )) {
1231
1232
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 );
1234
1235
1235
1236
flow = mlx5_add_flow_rules (mlx5_eswitch_get_slow_fdb (esw ),
1236
1237
spec , & flow_act , & dest , 1 );
1237
1238
if (IS_ERR (flow )) {
1238
1239
err = PTR_ERR (flow );
1239
1240
goto add_vf_flow_err ;
1240
1241
}
1241
- flows [vport -> index ] = flow ;
1242
+ flows [peer_vport -> index ] = flow ;
1242
1243
}
1243
1244
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 );
1250
1251
flow = mlx5_add_flow_rules (esw -> fdb_table .offloads .slow_fdb ,
1251
1252
spec , & flow_act , & dest , 1 );
1252
1253
if (IS_ERR (flow )) {
1253
1254
err = PTR_ERR (flow );
1254
1255
goto add_ec_vf_flow_err ;
1255
1256
}
1256
- flows [vport -> index ] = flow ;
1257
+ flows [peer_vport -> index ] = flow ;
1257
1258
}
1258
1259
}
1259
1260
@@ -1270,25 +1271,27 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
1270
1271
return 0 ;
1271
1272
1272
1273
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 ])
1275
1277
continue ;
1276
- mlx5_del_flow_rules (flows [vport -> index ]);
1278
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1277
1279
}
1278
1280
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 ])
1281
1284
continue ;
1282
- mlx5_del_flow_rules (flows [vport -> index ]);
1285
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1283
1286
}
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 ]);
1287
1290
}
1288
1291
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 ]);
1292
1295
}
1293
1296
add_pf_flow_err :
1294
1297
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,
1301
1304
static void esw_del_fdb_peer_miss_rules (struct mlx5_eswitch * esw ,
1302
1305
struct mlx5_core_dev * peer_dev )
1303
1306
{
1307
+ struct mlx5_eswitch * peer_esw = peer_dev -> priv .eswitch ;
1304
1308
u16 peer_index = mlx5_get_dev_index (peer_dev );
1305
1309
struct mlx5_flow_handle * * flows ;
1306
- struct mlx5_vport * vport ;
1310
+ struct mlx5_vport * peer_vport ;
1307
1311
unsigned long i ;
1308
1312
1309
1313
flows = esw -> fdb_table .offloads .peer_miss_rules [peer_index ];
1310
1314
if (!flows )
1311
1315
return ;
1312
1316
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 ]);
1322
1321
}
1323
1322
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 ]);
1326
1326
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 ]);
1330
1330
}
1331
1331
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 ]);
1335
1335
}
1336
1336
1337
1337
kvfree (flows );
0 commit comments