@@ -1182,19 +1182,19 @@ static void esw_set_peer_miss_rule_source_port(struct mlx5_eswitch *esw,
1182
1182
static int esw_add_fdb_peer_miss_rules (struct mlx5_eswitch * esw ,
1183
1183
struct mlx5_core_dev * peer_dev )
1184
1184
{
1185
+ struct mlx5_eswitch * peer_esw = peer_dev -> priv .eswitch ;
1185
1186
struct mlx5_flow_destination dest = {};
1186
1187
struct mlx5_flow_act flow_act = {0 };
1187
1188
struct mlx5_flow_handle * * flows ;
1188
- /* total vports is the same for both e-switches */
1189
- int nvports = esw -> total_vports ;
1190
1189
struct mlx5_flow_handle * flow ;
1190
+ struct mlx5_vport * peer_vport ;
1191
1191
struct mlx5_flow_spec * spec ;
1192
- struct mlx5_vport * vport ;
1193
1192
int err , pfindex ;
1194
1193
unsigned long i ;
1195
1194
void * misc ;
1196
1195
1197
- if (!MLX5_VPORT_MANAGER (esw -> dev ) && !mlx5_core_is_ecpf_esw_manager (esw -> dev ))
1196
+ if (!MLX5_VPORT_MANAGER (peer_dev ) &&
1197
+ !mlx5_core_is_ecpf_esw_manager (peer_dev ))
1198
1198
return 0 ;
1199
1199
1200
1200
spec = kvzalloc (sizeof (* spec ), GFP_KERNEL );
@@ -1203,7 +1203,7 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
1203
1203
1204
1204
peer_miss_rules_setup (esw , peer_dev , spec , & dest );
1205
1205
1206
- flows = kvcalloc (nvports , sizeof (* flows ), GFP_KERNEL );
1206
+ flows = kvcalloc (peer_esw -> total_vports , sizeof (* flows ), GFP_KERNEL );
1207
1207
if (!flows ) {
1208
1208
err = - ENOMEM ;
1209
1209
goto alloc_flows_err ;
@@ -1213,59 +1213,60 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
1213
1213
misc = MLX5_ADDR_OF (fte_match_param , spec -> match_value ,
1214
1214
misc_parameters );
1215
1215
1216
- if (mlx5_core_is_ecpf_esw_manager (esw -> dev )) {
1217
- vport = mlx5_eswitch_get_vport (esw , MLX5_VPORT_PF );
1218
- esw_set_peer_miss_rule_source_port (esw , peer_dev -> priv . eswitch ,
1219
- spec , MLX5_VPORT_PF );
1216
+ if (mlx5_core_is_ecpf_esw_manager (peer_dev )) {
1217
+ peer_vport = mlx5_eswitch_get_vport (peer_esw , MLX5_VPORT_PF );
1218
+ esw_set_peer_miss_rule_source_port (esw , peer_esw , spec ,
1219
+ MLX5_VPORT_PF );
1220
1220
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_pf_flow_err ;
1226
1226
}
1227
- flows [vport -> index ] = flow ;
1227
+ flows [peer_vport -> index ] = flow ;
1228
1228
}
1229
1229
1230
- if (mlx5_ecpf_vport_exists (esw -> dev )) {
1231
- vport = mlx5_eswitch_get_vport (esw , MLX5_VPORT_ECPF );
1230
+ if (mlx5_ecpf_vport_exists (peer_dev )) {
1231
+ peer_vport = mlx5_eswitch_get_vport (peer_esw , MLX5_VPORT_ECPF );
1232
1232
MLX5_SET (fte_match_set_misc , misc , source_port , MLX5_VPORT_ECPF );
1233
1233
flow = mlx5_add_flow_rules (mlx5_eswitch_get_slow_fdb (esw ),
1234
1234
spec , & flow_act , & dest , 1 );
1235
1235
if (IS_ERR (flow )) {
1236
1236
err = PTR_ERR (flow );
1237
1237
goto add_ecpf_flow_err ;
1238
1238
}
1239
- flows [vport -> index ] = flow ;
1239
+ flows [peer_vport -> index ] = flow ;
1240
1240
}
1241
1241
1242
- mlx5_esw_for_each_vf_vport (esw , i , vport , mlx5_core_max_vfs (esw -> dev )) {
1242
+ mlx5_esw_for_each_vf_vport (peer_esw , i , peer_vport ,
1243
+ mlx5_core_max_vfs (peer_dev )) {
1243
1244
esw_set_peer_miss_rule_source_port (esw ,
1244
- peer_dev -> priv . eswitch ,
1245
- spec , vport -> vport );
1245
+ peer_esw ,
1246
+ spec , peer_vport -> vport );
1246
1247
1247
1248
flow = mlx5_add_flow_rules (mlx5_eswitch_get_slow_fdb (esw ),
1248
1249
spec , & flow_act , & dest , 1 );
1249
1250
if (IS_ERR (flow )) {
1250
1251
err = PTR_ERR (flow );
1251
1252
goto add_vf_flow_err ;
1252
1253
}
1253
- flows [vport -> index ] = flow ;
1254
+ flows [peer_vport -> index ] = flow ;
1254
1255
}
1255
1256
1256
- if (mlx5_core_ec_sriov_enabled (esw -> dev )) {
1257
- mlx5_esw_for_each_ec_vf_vport (esw , i , vport , mlx5_core_max_ec_vfs ( esw -> dev )) {
1258
- if ( i >= mlx5_core_max_ec_vfs (peer_dev ))
1259
- break ;
1260
- esw_set_peer_miss_rule_source_port ( esw , peer_dev -> priv . eswitch ,
1261
- spec , vport -> vport );
1257
+ if (mlx5_core_ec_sriov_enabled (peer_dev )) {
1258
+ mlx5_esw_for_each_ec_vf_vport (peer_esw , i , peer_vport ,
1259
+ mlx5_core_max_ec_vfs (peer_dev )) {
1260
+ esw_set_peer_miss_rule_source_port ( esw , peer_esw ,
1261
+ spec ,
1262
+ peer_vport -> vport );
1262
1263
flow = mlx5_add_flow_rules (esw -> fdb_table .offloads .slow_fdb ,
1263
1264
spec , & flow_act , & dest , 1 );
1264
1265
if (IS_ERR (flow )) {
1265
1266
err = PTR_ERR (flow );
1266
1267
goto add_ec_vf_flow_err ;
1267
1268
}
1268
- flows [vport -> index ] = flow ;
1269
+ flows [peer_vport -> index ] = flow ;
1269
1270
}
1270
1271
}
1271
1272
@@ -1282,25 +1283,27 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
1282
1283
return 0 ;
1283
1284
1284
1285
add_ec_vf_flow_err :
1285
- mlx5_esw_for_each_ec_vf_vport (esw , i , vport , mlx5_core_max_ec_vfs (esw -> dev )) {
1286
- if (!flows [vport -> index ])
1286
+ mlx5_esw_for_each_ec_vf_vport (peer_esw , i , peer_vport ,
1287
+ mlx5_core_max_ec_vfs (peer_dev )) {
1288
+ if (!flows [peer_vport -> index ])
1287
1289
continue ;
1288
- mlx5_del_flow_rules (flows [vport -> index ]);
1290
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1289
1291
}
1290
1292
add_vf_flow_err :
1291
- mlx5_esw_for_each_vf_vport (esw , i , vport , mlx5_core_max_vfs (esw -> dev )) {
1292
- if (!flows [vport -> index ])
1293
+ mlx5_esw_for_each_vf_vport (peer_esw , i , peer_vport ,
1294
+ mlx5_core_max_vfs (peer_dev )) {
1295
+ if (!flows [peer_vport -> index ])
1293
1296
continue ;
1294
- mlx5_del_flow_rules (flows [vport -> index ]);
1297
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1295
1298
}
1296
- if (mlx5_ecpf_vport_exists (esw -> dev )) {
1297
- vport = mlx5_eswitch_get_vport (esw , MLX5_VPORT_ECPF );
1298
- mlx5_del_flow_rules (flows [vport -> index ]);
1299
+ if (mlx5_ecpf_vport_exists (peer_dev )) {
1300
+ peer_vport = mlx5_eswitch_get_vport (peer_esw , MLX5_VPORT_ECPF );
1301
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1299
1302
}
1300
1303
add_ecpf_flow_err :
1301
- if (mlx5_core_is_ecpf_esw_manager (esw -> dev )) {
1302
- vport = mlx5_eswitch_get_vport (esw , MLX5_VPORT_PF );
1303
- mlx5_del_flow_rules (flows [vport -> index ]);
1304
+ if (mlx5_core_is_ecpf_esw_manager (peer_dev )) {
1305
+ peer_vport = mlx5_eswitch_get_vport (peer_esw , MLX5_VPORT_PF );
1306
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1304
1307
}
1305
1308
add_pf_flow_err :
1306
1309
esw_warn (esw -> dev , "FDB: Failed to add peer miss flow rule err %d\n" , err );
@@ -1313,37 +1316,34 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
1313
1316
static void esw_del_fdb_peer_miss_rules (struct mlx5_eswitch * esw ,
1314
1317
struct mlx5_core_dev * peer_dev )
1315
1318
{
1319
+ struct mlx5_eswitch * peer_esw = peer_dev -> priv .eswitch ;
1316
1320
u16 peer_index = mlx5_get_dev_index (peer_dev );
1317
1321
struct mlx5_flow_handle * * flows ;
1318
- struct mlx5_vport * vport ;
1322
+ struct mlx5_vport * peer_vport ;
1319
1323
unsigned long i ;
1320
1324
1321
1325
flows = esw -> fdb_table .offloads .peer_miss_rules [peer_index ];
1322
1326
if (!flows )
1323
1327
return ;
1324
1328
1325
- if (mlx5_core_ec_sriov_enabled (esw -> dev )) {
1326
- mlx5_esw_for_each_ec_vf_vport (esw , i , vport , mlx5_core_max_ec_vfs (esw -> dev )) {
1327
- /* The flow for a particular vport could be NULL if the other ECPF
1328
- * has fewer or no VFs enabled
1329
- */
1330
- if (!flows [vport -> index ])
1331
- continue ;
1332
- mlx5_del_flow_rules (flows [vport -> index ]);
1333
- }
1329
+ if (mlx5_core_ec_sriov_enabled (peer_dev )) {
1330
+ mlx5_esw_for_each_ec_vf_vport (peer_esw , i , peer_vport ,
1331
+ mlx5_core_max_ec_vfs (peer_dev ))
1332
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1334
1333
}
1335
1334
1336
- mlx5_esw_for_each_vf_vport (esw , i , vport , mlx5_core_max_vfs (esw -> dev ))
1337
- mlx5_del_flow_rules (flows [vport -> index ]);
1335
+ mlx5_esw_for_each_vf_vport (peer_esw , i , peer_vport ,
1336
+ mlx5_core_max_vfs (peer_dev ))
1337
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1338
1338
1339
- if (mlx5_ecpf_vport_exists (esw -> dev )) {
1340
- vport = mlx5_eswitch_get_vport (esw , MLX5_VPORT_ECPF );
1341
- mlx5_del_flow_rules (flows [vport -> index ]);
1339
+ if (mlx5_ecpf_vport_exists (peer_dev )) {
1340
+ peer_vport = mlx5_eswitch_get_vport (peer_esw , MLX5_VPORT_ECPF );
1341
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1342
1342
}
1343
1343
1344
- if (mlx5_core_is_ecpf_esw_manager (esw -> dev )) {
1345
- vport = mlx5_eswitch_get_vport (esw , MLX5_VPORT_PF );
1346
- mlx5_del_flow_rules (flows [vport -> index ]);
1344
+ if (mlx5_core_is_ecpf_esw_manager (peer_dev )) {
1345
+ peer_vport = mlx5_eswitch_get_vport (peer_esw , MLX5_VPORT_PF );
1346
+ mlx5_del_flow_rules (flows [peer_vport -> index ]);
1347
1347
}
1348
1348
1349
1349
kvfree (flows );
0 commit comments