@@ -3342,6 +3342,7 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
3342
3342
struct mlx4_dev_cap * dev_cap = NULL ;
3343
3343
int existing_vfs = 0 ;
3344
3344
3345
+ devl_assert_locked (devlink );
3345
3346
dev = & priv -> dev ;
3346
3347
3347
3348
INIT_LIST_HEAD (& priv -> ctx_list );
@@ -3630,7 +3631,6 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
3630
3631
}
3631
3632
}
3632
3633
3633
- devl_lock (devlink );
3634
3634
for (port = 1 ; port <= dev -> caps .num_ports ; port ++ ) {
3635
3635
err = mlx4_init_port_info (dev , port );
3636
3636
if (err )
@@ -3644,7 +3644,6 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
3644
3644
if (err )
3645
3645
goto err_port ;
3646
3646
3647
- devl_unlock (devlink );
3648
3647
mlx4_request_modules (dev );
3649
3648
3650
3649
mlx4_sense_init (dev );
@@ -3661,7 +3660,6 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
3661
3660
err_port :
3662
3661
for (-- port ; port >= 1 ; -- port )
3663
3662
mlx4_cleanup_port_info (& priv -> port [port ]);
3664
- devl_unlock (devlink );
3665
3663
3666
3664
mlx4_cleanup_default_counters (dev );
3667
3665
if (!mlx4_is_slave (dev ))
@@ -3736,7 +3734,6 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
3736
3734
int prb_vf [MLX4_MAX_PORTS + 1 ] = {0 , 0 , 0 };
3737
3735
const int param_map [MLX4_MAX_PORTS + 1 ][MLX4_MAX_PORTS + 1 ] = {
3738
3736
{2 , 0 , 0 }, {0 , 1 , 2 }, {0 , 1 , 2 } };
3739
- struct devlink * devlink = priv_to_devlink (priv );
3740
3737
unsigned total_vfs = 0 ;
3741
3738
unsigned int i ;
3742
3739
@@ -3849,9 +3846,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
3849
3846
}
3850
3847
}
3851
3848
3852
- devl_lock (devlink );
3853
3849
err = mlx4_crdump_init (& priv -> dev );
3854
- devl_unlock (devlink );
3855
3850
if (err )
3856
3851
goto err_release_regions ;
3857
3852
@@ -3869,9 +3864,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
3869
3864
mlx4_catas_end (& priv -> dev );
3870
3865
3871
3866
err_crdump :
3872
- devl_lock (devlink );
3873
3867
mlx4_crdump_end (& priv -> dev );
3874
- devl_unlock (devlink );
3875
3868
3876
3869
err_release_regions :
3877
3870
pci_release_regions (pdev );
@@ -3965,9 +3958,11 @@ static int mlx4_devlink_reload_down(struct devlink *devlink, bool netns_change,
3965
3958
NL_SET_ERR_MSG_MOD (extack , "Namespace change is not supported" );
3966
3959
return - EOPNOTSUPP ;
3967
3960
}
3961
+ devl_lock (devlink );
3968
3962
if (persist -> num_vfs )
3969
3963
mlx4_warn (persist -> dev , "Reload performed on PF, will cause reset on operating Virtual Functions\n" );
3970
3964
mlx4_restart_one_down (persist -> pdev );
3965
+ devl_unlock (devlink );
3971
3966
return 0 ;
3972
3967
}
3973
3968
@@ -3980,8 +3975,10 @@ static int mlx4_devlink_reload_up(struct devlink *devlink, enum devlink_reload_a
3980
3975
struct mlx4_dev_persistent * persist = dev -> persist ;
3981
3976
int err ;
3982
3977
3978
+ devl_lock (devlink );
3983
3979
* actions_performed = BIT (DEVLINK_RELOAD_ACTION_DRIVER_REINIT );
3984
3980
err = mlx4_restart_one_up (persist -> pdev , true, devlink );
3981
+ devl_unlock (devlink );
3985
3982
if (err )
3986
3983
mlx4_err (persist -> dev , "mlx4_restart_one_up failed, ret=%d\n" ,
3987
3984
err );
@@ -4008,6 +4005,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
4008
4005
devlink = devlink_alloc (& mlx4_devlink_ops , sizeof (* priv ), & pdev -> dev );
4009
4006
if (!devlink )
4010
4007
return - ENOMEM ;
4008
+ devl_lock (devlink );
4011
4009
priv = devlink_priv (devlink );
4012
4010
4013
4011
dev = & priv -> dev ;
@@ -4035,6 +4033,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
4035
4033
4036
4034
pci_save_state (pdev );
4037
4035
devlink_set_features (devlink , DEVLINK_F_RELOAD );
4036
+ devl_unlock (devlink );
4038
4037
devlink_register (devlink );
4039
4038
return 0 ;
4040
4039
@@ -4044,6 +4043,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
4044
4043
err_devlink_unregister :
4045
4044
kfree (dev -> persist );
4046
4045
err_devlink_free :
4046
+ devl_unlock (devlink );
4047
4047
devlink_free (devlink );
4048
4048
return ret ;
4049
4049
}
@@ -4069,6 +4069,7 @@ static void mlx4_unload_one(struct pci_dev *pdev)
4069
4069
int p , i ;
4070
4070
4071
4071
devlink = priv_to_devlink (priv );
4072
+ devl_assert_locked (devlink );
4072
4073
if (priv -> removed )
4073
4074
return ;
4074
4075
@@ -4084,12 +4085,10 @@ static void mlx4_unload_one(struct pci_dev *pdev)
4084
4085
mlx4_stop_sense (dev );
4085
4086
mlx4_unregister_device (dev );
4086
4087
4087
- devl_lock (devlink );
4088
4088
for (p = 1 ; p <= dev -> caps .num_ports ; p ++ ) {
4089
4089
mlx4_cleanup_port_info (& priv -> port [p ]);
4090
4090
mlx4_CLOSE_PORT (dev , p );
4091
4091
}
4092
- devl_unlock (devlink );
4093
4092
4094
4093
if (mlx4_is_master (dev ))
4095
4094
mlx4_free_resource_tracker (dev ,
@@ -4150,6 +4149,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)
4150
4149
4151
4150
devlink_unregister (devlink );
4152
4151
4152
+ devl_lock (devlink );
4153
4153
if (mlx4_is_slave (dev ))
4154
4154
persist -> interface_state |= MLX4_INTERFACE_STATE_NOWAIT ;
4155
4155
@@ -4174,9 +4174,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)
4174
4174
else
4175
4175
mlx4_info (dev , "%s: interface is down\n" , __func__ );
4176
4176
mlx4_catas_end (dev );
4177
- devl_lock (devlink );
4178
4177
mlx4_crdump_end (dev );
4179
- devl_unlock (devlink );
4180
4178
if (dev -> flags & MLX4_FLAG_SRIOV && !active_vfs ) {
4181
4179
mlx4_warn (dev , "Disabling SR-IOV\n" );
4182
4180
pci_disable_sriov (pdev );
@@ -4187,6 +4185,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)
4187
4185
devlink_params_unregister (devlink , mlx4_devlink_params ,
4188
4186
ARRAY_SIZE (mlx4_devlink_params ));
4189
4187
kfree (dev -> persist );
4188
+ devl_unlock (devlink );
4190
4189
devlink_free (devlink );
4191
4190
}
4192
4191
@@ -4307,15 +4306,20 @@ static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev,
4307
4306
pci_channel_state_t state )
4308
4307
{
4309
4308
struct mlx4_dev_persistent * persist = pci_get_drvdata (pdev );
4309
+ struct mlx4_dev * dev = persist -> dev ;
4310
+ struct devlink * devlink ;
4310
4311
4311
4312
mlx4_err (persist -> dev , "mlx4_pci_err_detected was called\n" );
4312
4313
mlx4_enter_error_state (persist );
4313
4314
4315
+ devlink = priv_to_devlink (mlx4_priv (dev ));
4316
+ devl_lock (devlink );
4314
4317
mutex_lock (& persist -> interface_state_mutex );
4315
4318
if (persist -> interface_state & MLX4_INTERFACE_STATE_UP )
4316
4319
mlx4_unload_one (pdev );
4317
4320
4318
4321
mutex_unlock (& persist -> interface_state_mutex );
4322
+ devl_unlock (devlink );
4319
4323
if (state == pci_channel_io_perm_failure )
4320
4324
return PCI_ERS_RESULT_DISCONNECT ;
4321
4325
@@ -4348,13 +4352,16 @@ static void mlx4_pci_resume(struct pci_dev *pdev)
4348
4352
struct mlx4_dev * dev = persist -> dev ;
4349
4353
struct mlx4_priv * priv = mlx4_priv (dev );
4350
4354
int nvfs [MLX4_MAX_PORTS + 1 ] = {0 , 0 , 0 };
4355
+ struct devlink * devlink ;
4351
4356
int total_vfs ;
4352
4357
int err ;
4353
4358
4354
4359
mlx4_err (dev , "%s was called\n" , __func__ );
4355
4360
total_vfs = dev -> persist -> num_vfs ;
4356
4361
memcpy (nvfs , dev -> persist -> nvfs , sizeof (dev -> persist -> nvfs ));
4357
4362
4363
+ devlink = priv_to_devlink (priv );
4364
+ devl_lock (devlink );
4358
4365
mutex_lock (& persist -> interface_state_mutex );
4359
4366
if (!(persist -> interface_state & MLX4_INTERFACE_STATE_UP )) {
4360
4367
err = mlx4_load_one (pdev , priv -> pci_dev_data , total_vfs , nvfs ,
@@ -4373,19 +4380,23 @@ static void mlx4_pci_resume(struct pci_dev *pdev)
4373
4380
}
4374
4381
end :
4375
4382
mutex_unlock (& persist -> interface_state_mutex );
4376
-
4383
+ devl_unlock ( devlink );
4377
4384
}
4378
4385
4379
4386
static void mlx4_shutdown (struct pci_dev * pdev )
4380
4387
{
4381
4388
struct mlx4_dev_persistent * persist = pci_get_drvdata (pdev );
4382
4389
struct mlx4_dev * dev = persist -> dev ;
4390
+ struct devlink * devlink ;
4383
4391
4384
4392
mlx4_info (persist -> dev , "mlx4_shutdown was called\n" );
4393
+ devlink = priv_to_devlink (mlx4_priv (dev ));
4394
+ devl_lock (devlink );
4385
4395
mutex_lock (& persist -> interface_state_mutex );
4386
4396
if (persist -> interface_state & MLX4_INTERFACE_STATE_UP )
4387
4397
mlx4_unload_one (pdev );
4388
4398
mutex_unlock (& persist -> interface_state_mutex );
4399
+ devl_unlock (devlink );
4389
4400
mlx4_pci_disable_device (dev );
4390
4401
}
4391
4402
@@ -4400,12 +4411,16 @@ static int __maybe_unused mlx4_suspend(struct device *dev_d)
4400
4411
struct pci_dev * pdev = to_pci_dev (dev_d );
4401
4412
struct mlx4_dev_persistent * persist = pci_get_drvdata (pdev );
4402
4413
struct mlx4_dev * dev = persist -> dev ;
4414
+ struct devlink * devlink ;
4403
4415
4404
4416
mlx4_err (dev , "suspend was called\n" );
4417
+ devlink = priv_to_devlink (mlx4_priv (dev ));
4418
+ devl_lock (devlink );
4405
4419
mutex_lock (& persist -> interface_state_mutex );
4406
4420
if (persist -> interface_state & MLX4_INTERFACE_STATE_UP )
4407
4421
mlx4_unload_one (pdev );
4408
4422
mutex_unlock (& persist -> interface_state_mutex );
4423
+ devl_unlock (devlink );
4409
4424
4410
4425
return 0 ;
4411
4426
}
@@ -4417,13 +4432,16 @@ static int __maybe_unused mlx4_resume(struct device *dev_d)
4417
4432
struct mlx4_dev * dev = persist -> dev ;
4418
4433
struct mlx4_priv * priv = mlx4_priv (dev );
4419
4434
int nvfs [MLX4_MAX_PORTS + 1 ] = {0 , 0 , 0 };
4435
+ struct devlink * devlink ;
4420
4436
int total_vfs ;
4421
4437
int ret = 0 ;
4422
4438
4423
4439
mlx4_err (dev , "resume was called\n" );
4424
4440
total_vfs = dev -> persist -> num_vfs ;
4425
4441
memcpy (nvfs , dev -> persist -> nvfs , sizeof (dev -> persist -> nvfs ));
4426
4442
4443
+ devlink = priv_to_devlink (priv );
4444
+ devl_lock (devlink );
4427
4445
mutex_lock (& persist -> interface_state_mutex );
4428
4446
if (!(persist -> interface_state & MLX4_INTERFACE_STATE_UP )) {
4429
4447
ret = mlx4_load_one (pdev , priv -> pci_dev_data , total_vfs ,
@@ -4437,6 +4455,7 @@ static int __maybe_unused mlx4_resume(struct device *dev_d)
4437
4455
}
4438
4456
}
4439
4457
mutex_unlock (& persist -> interface_state_mutex );
4458
+ devl_unlock (devlink );
4440
4459
4441
4460
return ret ;
4442
4461
}
0 commit comments