Skip to content

Commit 3c453e8

Browse files
shayshyikuba-moo
authored andcommitted
net/mlx5: Fix peer devlink set for SF representor devlink port
The cited patch change register devlink flow, and neglect to reflect the changes for peer devlink set logic. Peer devlink set is triggering a call trace if done after devl_register.[1] Hence, align peer devlink set logic with register devlink flow. [1] WARNING: CPU: 4 PID: 3394 at net/devlink/core.c:155 devlink_rel_nested_in_add+0x177/0x180 CPU: 4 PID: 3394 Comm: kworker/u40:1 Not tainted 6.9.0-rc4_for_linust_min_debug_2024_04_16_14_08 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Workqueue: mlx5_vhca_event0 mlx5_vhca_state_work_handler [mlx5_core] RIP: 0010:devlink_rel_nested_in_add+0x177/0x180 Call Trace: <TASK> ? __warn+0x78/0x120 ? devlink_rel_nested_in_add+0x177/0x180 ? report_bug+0x16d/0x180 ? handle_bug+0x3c/0x60 ? exc_invalid_op+0x14/0x70 ? asm_exc_invalid_op+0x16/0x20 ? devlink_port_init+0x30/0x30 ? devlink_port_type_clear+0x50/0x50 ? devlink_rel_nested_in_add+0x177/0x180 ? devlink_rel_nested_in_add+0xdd/0x180 mlx5_sf_mdev_event+0x74/0xb0 [mlx5_core] notifier_call_chain+0x35/0xb0 blocking_notifier_call_chain+0x3d/0x60 mlx5_blocking_notifier_call_chain+0x22/0x30 [mlx5_core] mlx5_sf_dev_probe+0x185/0x3e0 [mlx5_core] auxiliary_bus_probe+0x38/0x80 ? driver_sysfs_add+0x51/0x80 really_probe+0xc5/0x3a0 ? driver_probe_device+0x90/0x90 __driver_probe_device+0x80/0x160 driver_probe_device+0x1e/0x90 __device_attach_driver+0x7d/0x100 bus_for_each_drv+0x80/0xd0 __device_attach+0xbc/0x1f0 bus_probe_device+0x86/0xa0 device_add+0x64f/0x860 __auxiliary_device_add+0x3b/0xa0 mlx5_sf_dev_add+0x139/0x330 [mlx5_core] mlx5_sf_dev_state_change_handler+0x1e4/0x250 [mlx5_core] notifier_call_chain+0x35/0xb0 blocking_notifier_call_chain+0x3d/0x60 mlx5_vhca_state_work_handler+0x151/0x200 [mlx5_core] process_one_work+0x13f/0x2e0 worker_thread+0x2bd/0x3c0 ? rescuer_thread+0x410/0x410 kthread+0xc4/0xf0 ? kthread_complete_and_exit+0x20/0x20 ret_from_fork+0x2d/0x50 ? kthread_complete_and_exit+0x20/0x20 ret_from_fork_asm+0x11/0x20 </TASK> Fixes: bf72998 ("net/mlx5: Restore mistakenly dropped parts in register devlink flow") Fixes: c6e77aa ("net/mlx5: Register devlink first under devlink lock") Signed-off-by: Shay Drory <[email protected]> Reviewed-by: Moshe Shemesh <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 3d59184 commit 3c453e8

File tree

2 files changed

+13
-20
lines changed

2 files changed

+13
-20
lines changed

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

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1680,6 +1680,8 @@ int mlx5_init_one_light(struct mlx5_core_dev *dev)
16801680
struct devlink *devlink = priv_to_devlink(dev);
16811681
int err;
16821682

1683+
devl_lock(devlink);
1684+
devl_register(devlink);
16831685
dev->state = MLX5_DEVICE_STATE_UP;
16841686
err = mlx5_function_enable(dev, true, mlx5_tout_ms(dev, FW_PRE_INIT_TIMEOUT));
16851687
if (err) {
@@ -1693,27 +1695,21 @@ int mlx5_init_one_light(struct mlx5_core_dev *dev)
16931695
goto query_hca_caps_err;
16941696
}
16951697

1696-
devl_lock(devlink);
1697-
devl_register(devlink);
1698-
16991698
err = mlx5_devlink_params_register(priv_to_devlink(dev));
17001699
if (err) {
17011700
mlx5_core_warn(dev, "mlx5_devlink_param_reg err = %d\n", err);
1702-
goto params_reg_err;
1701+
goto query_hca_caps_err;
17031702
}
17041703

17051704
devl_unlock(devlink);
17061705
return 0;
17071706

1708-
params_reg_err:
1709-
devl_unregister(devlink);
1710-
devl_unlock(devlink);
17111707
query_hca_caps_err:
1712-
devl_unregister(devlink);
1713-
devl_unlock(devlink);
17141708
mlx5_function_disable(dev, true);
17151709
out:
17161710
dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
1711+
devl_unregister(devlink);
1712+
devl_unlock(devlink);
17171713
return err;
17181714
}
17191715

drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia
6060
goto remap_err;
6161
}
6262

63+
/* Peer devlink logic expects to work on unregistered devlink instance. */
64+
err = mlx5_core_peer_devlink_set(sf_dev, devlink);
65+
if (err) {
66+
mlx5_core_warn(mdev, "mlx5_core_peer_devlink_set err=%d\n", err);
67+
goto peer_devlink_set_err;
68+
}
69+
6370
if (MLX5_ESWITCH_MANAGER(sf_dev->parent_mdev))
6471
err = mlx5_init_one_light(mdev);
6572
else
@@ -69,20 +76,10 @@ static int mlx5_sf_dev_probe(struct auxiliary_device *adev, const struct auxilia
6976
goto init_one_err;
7077
}
7178

72-
err = mlx5_core_peer_devlink_set(sf_dev, devlink);
73-
if (err) {
74-
mlx5_core_warn(mdev, "mlx5_core_peer_devlink_set err=%d\n", err);
75-
goto peer_devlink_set_err;
76-
}
77-
7879
return 0;
7980

80-
peer_devlink_set_err:
81-
if (mlx5_dev_is_lightweight(sf_dev->mdev))
82-
mlx5_uninit_one_light(sf_dev->mdev);
83-
else
84-
mlx5_uninit_one(sf_dev->mdev);
8581
init_one_err:
82+
peer_devlink_set_err:
8683
iounmap(mdev->iseg);
8784
remap_err:
8885
mlx5_mdev_uninit(mdev);

0 commit comments

Comments
 (0)