Skip to content

Commit 60d7cee

Browse files
mosheshemesh2kuba-moo
authored andcommitted
net/mlx4: Lock mlx4 devlink reload callback
Change devlink instance locks in mlx4 driver to have devlink reload callback locked, while keeping all driver paths which leads to devl_ API functions called by the mlx4 driver locked. Signed-off-by: Moshe Shemesh <[email protected]> Reviewed-by: Tariq Toukan <[email protected]> Reviewed-by: Jiri Pirko <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent a8c0551 commit 60d7cee

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

drivers/net/ethernet/mellanox/mlx4/catas.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,13 @@ void mlx4_enter_error_state(struct mlx4_dev_persistent *persist)
204204

205205
static void mlx4_handle_error_state(struct mlx4_dev_persistent *persist)
206206
{
207+
struct mlx4_dev *dev = persist->dev;
208+
struct devlink *devlink;
207209
int err = 0;
208210

209211
mlx4_enter_error_state(persist);
212+
devlink = priv_to_devlink(mlx4_priv(dev));
213+
devl_lock(devlink);
210214
mutex_lock(&persist->interface_state_mutex);
211215
if (persist->interface_state & MLX4_INTERFACE_STATE_UP &&
212216
!(persist->interface_state & MLX4_INTERFACE_STATE_DELETION)) {
@@ -215,6 +219,7 @@ static void mlx4_handle_error_state(struct mlx4_dev_persistent *persist)
215219
err);
216220
}
217221
mutex_unlock(&persist->interface_state_mutex);
222+
devl_unlock(devlink);
218223
}
219224

220225
static void dump_err_buf(struct mlx4_dev *dev)

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3342,6 +3342,7 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
33423342
struct mlx4_dev_cap *dev_cap = NULL;
33433343
int existing_vfs = 0;
33443344

3345+
devl_assert_locked(devlink);
33453346
dev = &priv->dev;
33463347

33473348
INIT_LIST_HEAD(&priv->ctx_list);
@@ -3630,7 +3631,6 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
36303631
}
36313632
}
36323633

3633-
devl_lock(devlink);
36343634
for (port = 1; port <= dev->caps.num_ports; port++) {
36353635
err = mlx4_init_port_info(dev, port);
36363636
if (err)
@@ -3644,7 +3644,6 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
36443644
if (err)
36453645
goto err_port;
36463646

3647-
devl_unlock(devlink);
36483647
mlx4_request_modules(dev);
36493648

36503649
mlx4_sense_init(dev);
@@ -3661,7 +3660,6 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
36613660
err_port:
36623661
for (--port; port >= 1; --port)
36633662
mlx4_cleanup_port_info(&priv->port[port]);
3664-
devl_unlock(devlink);
36653663

36663664
mlx4_cleanup_default_counters(dev);
36673665
if (!mlx4_is_slave(dev))
@@ -3736,7 +3734,6 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
37363734
int prb_vf[MLX4_MAX_PORTS + 1] = {0, 0, 0};
37373735
const int param_map[MLX4_MAX_PORTS + 1][MLX4_MAX_PORTS + 1] = {
37383736
{2, 0, 0}, {0, 1, 2}, {0, 1, 2} };
3739-
struct devlink *devlink = priv_to_devlink(priv);
37403737
unsigned total_vfs = 0;
37413738
unsigned int i;
37423739

@@ -3849,9 +3846,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
38493846
}
38503847
}
38513848

3852-
devl_lock(devlink);
38533849
err = mlx4_crdump_init(&priv->dev);
3854-
devl_unlock(devlink);
38553850
if (err)
38563851
goto err_release_regions;
38573852

@@ -3869,9 +3864,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data,
38693864
mlx4_catas_end(&priv->dev);
38703865

38713866
err_crdump:
3872-
devl_lock(devlink);
38733867
mlx4_crdump_end(&priv->dev);
3874-
devl_unlock(devlink);
38753868

38763869
err_release_regions:
38773870
pci_release_regions(pdev);
@@ -3965,9 +3958,11 @@ static int mlx4_devlink_reload_down(struct devlink *devlink, bool netns_change,
39653958
NL_SET_ERR_MSG_MOD(extack, "Namespace change is not supported");
39663959
return -EOPNOTSUPP;
39673960
}
3961+
devl_lock(devlink);
39683962
if (persist->num_vfs)
39693963
mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n");
39703964
mlx4_restart_one_down(persist->pdev);
3965+
devl_unlock(devlink);
39713966
return 0;
39723967
}
39733968

@@ -3980,8 +3975,10 @@ static int mlx4_devlink_reload_up(struct devlink *devlink, enum devlink_reload_a
39803975
struct mlx4_dev_persistent *persist = dev->persist;
39813976
int err;
39823977

3978+
devl_lock(devlink);
39833979
*actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
39843980
err = mlx4_restart_one_up(persist->pdev, true, devlink);
3981+
devl_unlock(devlink);
39853982
if (err)
39863983
mlx4_err(persist->dev, "mlx4_restart_one_up failed, ret=%d\n",
39873984
err);
@@ -4008,6 +4005,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
40084005
devlink = devlink_alloc(&mlx4_devlink_ops, sizeof(*priv), &pdev->dev);
40094006
if (!devlink)
40104007
return -ENOMEM;
4008+
devl_lock(devlink);
40114009
priv = devlink_priv(devlink);
40124010

40134011
dev = &priv->dev;
@@ -4035,6 +4033,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
40354033

40364034
pci_save_state(pdev);
40374035
devlink_set_features(devlink, DEVLINK_F_RELOAD);
4036+
devl_unlock(devlink);
40384037
devlink_register(devlink);
40394038
return 0;
40404039

@@ -4044,6 +4043,7 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
40444043
err_devlink_unregister:
40454044
kfree(dev->persist);
40464045
err_devlink_free:
4046+
devl_unlock(devlink);
40474047
devlink_free(devlink);
40484048
return ret;
40494049
}
@@ -4069,6 +4069,7 @@ static void mlx4_unload_one(struct pci_dev *pdev)
40694069
int p, i;
40704070

40714071
devlink = priv_to_devlink(priv);
4072+
devl_assert_locked(devlink);
40724073
if (priv->removed)
40734074
return;
40744075

@@ -4084,12 +4085,10 @@ static void mlx4_unload_one(struct pci_dev *pdev)
40844085
mlx4_stop_sense(dev);
40854086
mlx4_unregister_device(dev);
40864087

4087-
devl_lock(devlink);
40884088
for (p = 1; p <= dev->caps.num_ports; p++) {
40894089
mlx4_cleanup_port_info(&priv->port[p]);
40904090
mlx4_CLOSE_PORT(dev, p);
40914091
}
4092-
devl_unlock(devlink);
40934092

40944093
if (mlx4_is_master(dev))
40954094
mlx4_free_resource_tracker(dev,
@@ -4150,6 +4149,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)
41504149

41514150
devlink_unregister(devlink);
41524151

4152+
devl_lock(devlink);
41534153
if (mlx4_is_slave(dev))
41544154
persist->interface_state |= MLX4_INTERFACE_STATE_NOWAIT;
41554155

@@ -4174,9 +4174,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)
41744174
else
41754175
mlx4_info(dev, "%s: interface is down\n", __func__);
41764176
mlx4_catas_end(dev);
4177-
devl_lock(devlink);
41784177
mlx4_crdump_end(dev);
4179-
devl_unlock(devlink);
41804178
if (dev->flags & MLX4_FLAG_SRIOV && !active_vfs) {
41814179
mlx4_warn(dev, "Disabling SR-IOV\n");
41824180
pci_disable_sriov(pdev);
@@ -4187,6 +4185,7 @@ static void mlx4_remove_one(struct pci_dev *pdev)
41874185
devlink_params_unregister(devlink, mlx4_devlink_params,
41884186
ARRAY_SIZE(mlx4_devlink_params));
41894187
kfree(dev->persist);
4188+
devl_unlock(devlink);
41904189
devlink_free(devlink);
41914190
}
41924191

@@ -4307,15 +4306,20 @@ static pci_ers_result_t mlx4_pci_err_detected(struct pci_dev *pdev,
43074306
pci_channel_state_t state)
43084307
{
43094308
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
4309+
struct mlx4_dev *dev = persist->dev;
4310+
struct devlink *devlink;
43104311

43114312
mlx4_err(persist->dev, "mlx4_pci_err_detected was called\n");
43124313
mlx4_enter_error_state(persist);
43134314

4315+
devlink = priv_to_devlink(mlx4_priv(dev));
4316+
devl_lock(devlink);
43144317
mutex_lock(&persist->interface_state_mutex);
43154318
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
43164319
mlx4_unload_one(pdev);
43174320

43184321
mutex_unlock(&persist->interface_state_mutex);
4322+
devl_unlock(devlink);
43194323
if (state == pci_channel_io_perm_failure)
43204324
return PCI_ERS_RESULT_DISCONNECT;
43214325

@@ -4348,13 +4352,16 @@ static void mlx4_pci_resume(struct pci_dev *pdev)
43484352
struct mlx4_dev *dev = persist->dev;
43494353
struct mlx4_priv *priv = mlx4_priv(dev);
43504354
int nvfs[MLX4_MAX_PORTS + 1] = {0, 0, 0};
4355+
struct devlink *devlink;
43514356
int total_vfs;
43524357
int err;
43534358

43544359
mlx4_err(dev, "%s was called\n", __func__);
43554360
total_vfs = dev->persist->num_vfs;
43564361
memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs));
43574362

4363+
devlink = priv_to_devlink(priv);
4364+
devl_lock(devlink);
43584365
mutex_lock(&persist->interface_state_mutex);
43594366
if (!(persist->interface_state & MLX4_INTERFACE_STATE_UP)) {
43604367
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)
43734380
}
43744381
end:
43754382
mutex_unlock(&persist->interface_state_mutex);
4376-
4383+
devl_unlock(devlink);
43774384
}
43784385

43794386
static void mlx4_shutdown(struct pci_dev *pdev)
43804387
{
43814388
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
43824389
struct mlx4_dev *dev = persist->dev;
4390+
struct devlink *devlink;
43834391

43844392
mlx4_info(persist->dev, "mlx4_shutdown was called\n");
4393+
devlink = priv_to_devlink(mlx4_priv(dev));
4394+
devl_lock(devlink);
43854395
mutex_lock(&persist->interface_state_mutex);
43864396
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
43874397
mlx4_unload_one(pdev);
43884398
mutex_unlock(&persist->interface_state_mutex);
4399+
devl_unlock(devlink);
43894400
mlx4_pci_disable_device(dev);
43904401
}
43914402

@@ -4400,12 +4411,16 @@ static int __maybe_unused mlx4_suspend(struct device *dev_d)
44004411
struct pci_dev *pdev = to_pci_dev(dev_d);
44014412
struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
44024413
struct mlx4_dev *dev = persist->dev;
4414+
struct devlink *devlink;
44034415

44044416
mlx4_err(dev, "suspend was called\n");
4417+
devlink = priv_to_devlink(mlx4_priv(dev));
4418+
devl_lock(devlink);
44054419
mutex_lock(&persist->interface_state_mutex);
44064420
if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
44074421
mlx4_unload_one(pdev);
44084422
mutex_unlock(&persist->interface_state_mutex);
4423+
devl_unlock(devlink);
44094424

44104425
return 0;
44114426
}
@@ -4417,13 +4432,16 @@ static int __maybe_unused mlx4_resume(struct device *dev_d)
44174432
struct mlx4_dev *dev = persist->dev;
44184433
struct mlx4_priv *priv = mlx4_priv(dev);
44194434
int nvfs[MLX4_MAX_PORTS + 1] = {0, 0, 0};
4435+
struct devlink *devlink;
44204436
int total_vfs;
44214437
int ret = 0;
44224438

44234439
mlx4_err(dev, "resume was called\n");
44244440
total_vfs = dev->persist->num_vfs;
44254441
memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs));
44264442

4443+
devlink = priv_to_devlink(priv);
4444+
devl_lock(devlink);
44274445
mutex_lock(&persist->interface_state_mutex);
44284446
if (!(persist->interface_state & MLX4_INTERFACE_STATE_UP)) {
44294447
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)
44374455
}
44384456
}
44394457
mutex_unlock(&persist->interface_state_mutex);
4458+
devl_unlock(devlink);
44404459

44414460
return ret;
44424461
}

0 commit comments

Comments
 (0)