Skip to content

Commit 091268f

Browse files
mosheshemesh2gregkh
authored andcommitted
net/mlx5: Fix missing lock on sync reset reload
[ Upstream commit 572f9ca ] On sync reset reload work, when remote host updates devlink on reload actions performed on that host, it misses taking devlink lock before calling devlink_remote_reload_actions_performed() which results in triggering lock assert like the following: WARNING: CPU: 4 PID: 1164 at net/devlink/core.c:261 devl_assert_locked+0x3e/0x50 … CPU: 4 PID: 1164 Comm: kworker/u96:6 Tainted: G S W 6.10.0-rc2+ #116 Hardware name: Supermicro SYS-2028TP-DECTR/X10DRT-PT, BIOS 2.0 12/18/2015 Workqueue: mlx5_fw_reset_events mlx5_sync_reset_reload_work [mlx5_core] RIP: 0010:devl_assert_locked+0x3e/0x50 … Call Trace: <TASK> ? __warn+0xa4/0x210 ? devl_assert_locked+0x3e/0x50 ? report_bug+0x160/0x280 ? handle_bug+0x3f/0x80 ? exc_invalid_op+0x17/0x40 ? asm_exc_invalid_op+0x1a/0x20 ? devl_assert_locked+0x3e/0x50 devlink_notify+0x88/0x2b0 ? mlx5_attach_device+0x20c/0x230 [mlx5_core] ? __pfx_devlink_notify+0x10/0x10 ? process_one_work+0x4b6/0xbb0 process_one_work+0x4b6/0xbb0 […] Fixes: 84a433a ("net/mlx5: Lock mlx5 devlink reload callbacks") Signed-off-by: Moshe Shemesh <[email protected]> Reviewed-by: Maor Gottlieb <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Reviewed-by: Wojciech Drewek <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 1fe4ad6 commit 091268f

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ int mlx5_fw_reset_set_live_patch(struct mlx5_core_dev *dev)
207207
static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev, bool unloaded)
208208
{
209209
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
210+
struct devlink *devlink = priv_to_devlink(dev);
210211

211212
/* if this is the driver that initiated the fw reset, devlink completed the reload */
212213
if (test_bit(MLX5_FW_RESET_FLAGS_PENDING_COMP, &fw_reset->reset_flags)) {
@@ -218,9 +219,11 @@ static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev, bool unload
218219
mlx5_core_err(dev, "reset reload flow aborted, PCI reads still not working\n");
219220
else
220221
mlx5_load_one(dev, true);
221-
devlink_remote_reload_actions_performed(priv_to_devlink(dev), 0,
222+
devl_lock(devlink);
223+
devlink_remote_reload_actions_performed(devlink, 0,
222224
BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT) |
223225
BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE));
226+
devl_unlock(devlink);
224227
}
225228
}
226229

0 commit comments

Comments
 (0)