@@ -1152,8 +1152,6 @@ mlx5_eswitch_update_num_of_vfs(struct mlx5_eswitch *esw, int num_vfs)
1152
1152
{
1153
1153
const u32 * out ;
1154
1154
1155
- WARN_ON_ONCE (esw -> mode != MLX5_ESWITCH_NONE );
1156
-
1157
1155
if (num_vfs < 0 )
1158
1156
return ;
1159
1157
@@ -1287,7 +1285,7 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *esw, int mode, int num_vfs)
1287
1285
return 0 ;
1288
1286
1289
1287
abort :
1290
- esw -> mode = MLX5_ESWITCH_NONE ;
1288
+ esw -> mode = MLX5_ESWITCH_LEGACY ;
1291
1289
1292
1290
if (mode == MLX5_ESWITCH_OFFLOADS )
1293
1291
mlx5_rescan_drivers (esw -> dev );
@@ -1312,13 +1310,13 @@ int mlx5_eswitch_enable(struct mlx5_eswitch *esw, int num_vfs)
1312
1310
if (!mlx5_esw_allowed (esw ))
1313
1311
return 0 ;
1314
1312
1315
- toggle_lag = esw -> mode == MLX5_ESWITCH_NONE ;
1313
+ toggle_lag = ! mlx5_esw_is_fdb_created ( esw ) ;
1316
1314
1317
1315
if (toggle_lag )
1318
1316
mlx5_lag_disable_change (esw -> dev );
1319
1317
1320
1318
down_write (& esw -> mode_lock );
1321
- if (esw -> mode == MLX5_ESWITCH_NONE ) {
1319
+ if (! mlx5_esw_is_fdb_created ( esw ) ) {
1322
1320
ret = mlx5_eswitch_enable_locked (esw , MLX5_ESWITCH_LEGACY , num_vfs );
1323
1321
} else {
1324
1322
enum mlx5_eswitch_vport_event vport_events ;
@@ -1337,56 +1335,79 @@ int mlx5_eswitch_enable(struct mlx5_eswitch *esw, int num_vfs)
1337
1335
return ret ;
1338
1336
}
1339
1337
1340
- void mlx5_eswitch_disable_locked (struct mlx5_eswitch * esw , bool clear_vf )
1338
+ /* When disabling sriov, free driver level resources. */
1339
+ void mlx5_eswitch_disable_sriov (struct mlx5_eswitch * esw , bool clear_vf )
1341
1340
{
1342
- struct devlink * devlink = priv_to_devlink (esw -> dev );
1343
- int old_mode ;
1344
-
1345
- lockdep_assert_held_write (& esw -> mode_lock );
1346
-
1347
- if (esw -> mode == MLX5_ESWITCH_NONE )
1341
+ if (!mlx5_esw_allowed (esw ))
1348
1342
return ;
1349
1343
1350
- esw_info (esw -> dev , "Disable: mode(%s), nvfs(%d), active vports(%d)\n" ,
1344
+ down_write (& esw -> mode_lock );
1345
+ /* If driver is unloaded, this function is called twice by remove_one()
1346
+ * and mlx5_unload(). Prevent the second call.
1347
+ */
1348
+ if (!esw -> esw_funcs .num_vfs && !clear_vf )
1349
+ goto unlock ;
1350
+
1351
+ esw_info (esw -> dev , "Unload vfs: mode(%s), nvfs(%d), active vports(%d)\n" ,
1351
1352
esw -> mode == MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS" ,
1352
1353
esw -> esw_funcs .num_vfs , esw -> enabled_vports );
1353
1354
1355
+ mlx5_eswitch_unload_vf_vports (esw , esw -> esw_funcs .num_vfs );
1356
+ if (clear_vf )
1357
+ mlx5_eswitch_clear_vf_vports_info (esw );
1358
+ /* If disabling sriov in switchdev mode, free meta rules here
1359
+ * because it depends on num_vfs.
1360
+ */
1361
+ if (esw -> mode == MLX5_ESWITCH_OFFLOADS ) {
1362
+ struct devlink * devlink = priv_to_devlink (esw -> dev );
1363
+
1364
+ esw_offloads_del_send_to_vport_meta_rules (esw );
1365
+ devlink_rate_nodes_destroy (devlink );
1366
+ }
1367
+
1368
+ esw -> esw_funcs .num_vfs = 0 ;
1369
+
1370
+ unlock :
1371
+ up_write (& esw -> mode_lock );
1372
+ }
1373
+
1374
+ /* Free resources for corresponding eswitch mode. It is called by devlink
1375
+ * when changing eswitch mode or modprobe when unloading driver.
1376
+ */
1377
+ void mlx5_eswitch_disable_locked (struct mlx5_eswitch * esw )
1378
+ {
1379
+ struct devlink * devlink = priv_to_devlink (esw -> dev );
1380
+
1354
1381
/* Notify eswitch users that it is exiting from current mode.
1355
1382
* So that it can do necessary cleanup before the eswitch is disabled.
1356
1383
*/
1357
- mlx5_esw_mode_change_notify (esw , MLX5_ESWITCH_NONE );
1384
+ mlx5_esw_mode_change_notify (esw , MLX5_ESWITCH_LEGACY );
1358
1385
1359
1386
mlx5_eswitch_event_handlers_unregister (esw );
1360
1387
1388
+ esw_info (esw -> dev , "Disable: mode(%s), nvfs(%d), active vports(%d)\n" ,
1389
+ esw -> mode == MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS" ,
1390
+ esw -> esw_funcs .num_vfs , esw -> enabled_vports );
1391
+
1361
1392
esw -> fdb_table .flags &= ~MLX5_ESW_FDB_CREATED ;
1362
- if (esw -> mode == MLX5_ESWITCH_LEGACY )
1363
- esw_legacy_disable (esw );
1364
- else if (esw -> mode == MLX5_ESWITCH_OFFLOADS )
1393
+ if (esw -> mode == MLX5_ESWITCH_OFFLOADS )
1365
1394
esw_offloads_disable (esw );
1366
-
1367
- old_mode = esw -> mode ;
1368
- esw -> mode = MLX5_ESWITCH_NONE ;
1369
-
1370
- if (old_mode == MLX5_ESWITCH_OFFLOADS )
1371
- mlx5_rescan_drivers (esw -> dev );
1372
-
1373
- devlink_rate_nodes_destroy (devlink );
1374
-
1395
+ else if (esw -> mode == MLX5_ESWITCH_LEGACY )
1396
+ esw_legacy_disable (esw );
1375
1397
mlx5_esw_acls_ns_cleanup (esw );
1376
1398
1377
- if (clear_vf )
1378
- mlx5_eswitch_clear_vf_vports_info ( esw );
1399
+ if (esw -> mode == MLX5_ESWITCH_OFFLOADS )
1400
+ devlink_rate_nodes_destroy ( devlink );
1379
1401
}
1380
1402
1381
- void mlx5_eswitch_disable (struct mlx5_eswitch * esw , bool clear_vf )
1403
+ void mlx5_eswitch_disable (struct mlx5_eswitch * esw )
1382
1404
{
1383
1405
if (!mlx5_esw_allowed (esw ))
1384
1406
return ;
1385
1407
1386
1408
mlx5_lag_disable_change (esw -> dev );
1387
1409
down_write (& esw -> mode_lock );
1388
- mlx5_eswitch_disable_locked (esw , clear_vf );
1389
- esw -> esw_funcs .num_vfs = 0 ;
1410
+ mlx5_eswitch_disable_locked (esw );
1390
1411
up_write (& esw -> mode_lock );
1391
1412
mlx5_lag_enable_change (esw -> dev );
1392
1413
}
@@ -1581,7 +1602,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
1581
1602
refcount_set (& esw -> qos .refcnt , 0 );
1582
1603
1583
1604
esw -> enabled_vports = 0 ;
1584
- esw -> mode = MLX5_ESWITCH_NONE ;
1605
+ esw -> mode = MLX5_ESWITCH_LEGACY ;
1585
1606
esw -> offloads .inline_mode = MLX5_INLINE_MODE_NONE ;
1586
1607
if (MLX5_CAP_ESW_FLOWTABLE_FDB (dev , reformat ) &&
1587
1608
MLX5_CAP_ESW_FLOWTABLE_FDB (dev , decap ))
@@ -1883,7 +1904,7 @@ u8 mlx5_eswitch_mode(const struct mlx5_core_dev *dev)
1883
1904
{
1884
1905
struct mlx5_eswitch * esw = dev -> priv .eswitch ;
1885
1906
1886
- return mlx5_esw_allowed (esw ) ? esw -> mode : MLX5_ESWITCH_NONE ;
1907
+ return mlx5_esw_allowed (esw ) ? esw -> mode : MLX5_ESWITCH_LEGACY ;
1887
1908
}
1888
1909
EXPORT_SYMBOL_GPL (mlx5_eswitch_mode );
1889
1910
0 commit comments