Skip to content

Commit 98f91c4

Browse files
paravmellanoxSaeed Mahameed
authored andcommitted
net/mlx5: Fix devlink objects and devlink device unregister sequence
Current below problems exists. 1. devlink device is registered by mlx5_load_one(). But it is not unregistered by mlx5_unload_one(). This is incorrect. 2. Above issue leads to, When mlx5 PCI device is removed, currently devlink device is unregistered before devlink ports are unregistered in below ladder diagram. remove_one() mlx5_devlink_unregister() [..] devlink_unregister() <- ports are still registered! mlx5_unload_one() mlx5_unregister_device() mlx5_remove_device() mlx5e_remove() mlx5e_devlink_port_unregister() devlink_port_unregister() 3. Condition checking for registering and unregister device are not symmetric either in these routines. Hence, fix the sequence by having load and unload routines symmetric and in right order. i.e. (a) register devlink device followed by registering devlink ports (b) unregister devlink ports followed by devlink device Do this based on boot and cleanup flags instead of different conditions. Fixes: c6acd62 ("net/mlx5e: Add support for devlink-port in non-representors mode") Fixes: f60f315 ("net/mlx5e: Register devlink ports for physical link, PCI PF, VFs") Signed-off-by: Parav Pandit <[email protected]> Reviewed-by: Moshe Shemesh <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 60904cd commit 98f91c4

File tree

1 file changed

+13
-14
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+13
-14
lines changed

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

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,23 +1199,22 @@ int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
11991199
if (err)
12001200
goto err_load;
12011201

1202+
set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
1203+
12021204
if (boot) {
12031205
err = mlx5_devlink_register(priv_to_devlink(dev), dev->device);
12041206
if (err)
12051207
goto err_devlink_reg;
1206-
}
1207-
1208-
if (mlx5_device_registered(dev))
1209-
mlx5_attach_device(dev);
1210-
else
12111208
mlx5_register_device(dev);
1212-
1213-
set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
1209+
} else {
1210+
mlx5_attach_device(dev);
1211+
}
12141212

12151213
mutex_unlock(&dev->intf_state_mutex);
12161214
return 0;
12171215

12181216
err_devlink_reg:
1217+
clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
12191218
mlx5_unload(dev);
12201219
err_load:
12211220
if (boot)
@@ -1231,10 +1230,15 @@ int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
12311230

12321231
void mlx5_unload_one(struct mlx5_core_dev *dev, bool cleanup)
12331232
{
1234-
if (cleanup)
1233+
mutex_lock(&dev->intf_state_mutex);
1234+
1235+
if (cleanup) {
12351236
mlx5_unregister_device(dev);
1237+
mlx5_devlink_unregister(priv_to_devlink(dev));
1238+
} else {
1239+
mlx5_detach_device(dev);
1240+
}
12361241

1237-
mutex_lock(&dev->intf_state_mutex);
12381242
if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
12391243
mlx5_core_warn(dev, "%s: interface is down, NOP\n",
12401244
__func__);
@@ -1245,9 +1249,6 @@ void mlx5_unload_one(struct mlx5_core_dev *dev, bool cleanup)
12451249

12461250
clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
12471251

1248-
if (mlx5_device_registered(dev))
1249-
mlx5_detach_device(dev);
1250-
12511252
mlx5_unload(dev);
12521253

12531254
if (cleanup)
@@ -1387,8 +1388,6 @@ static void remove_one(struct pci_dev *pdev)
13871388

13881389
devlink_reload_disable(devlink);
13891390
mlx5_crdump_disable(dev);
1390-
mlx5_devlink_unregister(devlink);
1391-
13921391
mlx5_drain_health_wq(dev);
13931392
mlx5_unload_one(dev, true);
13941393
mlx5_pci_close(dev);

0 commit comments

Comments
 (0)