diff options
author | Jakub Kicinski <kuba@kernel.org> | 2022-12-14 18:01:00 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-12-31 13:32:55 +0100 |
commit | 6298cab4d80bfdb6fe01fe31fd9f0ba26317fdae (patch) | |
tree | 6987633f09919107534e3d5332fc01a47634744b /net | |
parent | 71e00044628125f9ff8d3114edf1f05baed8f529 (diff) | |
download | linux-stable-6298cab4d80bfdb6fe01fe31fd9f0ba26317fdae.tar.gz linux-stable-6298cab4d80bfdb6fe01fe31fd9f0ba26317fdae.tar.bz2 linux-stable-6298cab4d80bfdb6fe01fe31fd9f0ba26317fdae.zip |
devlink: hold region lock when flushing snapshots
[ Upstream commit b4cafb3d2c740f8d1b1234b43ac4a60e5291c960 ]
Netdevsim triggers a splat on reload, when it destroys regions
with snapshots pending:
WARNING: CPU: 1 PID: 787 at net/core/devlink.c:6291 devlink_region_snapshot_del+0x12e/0x140
CPU: 1 PID: 787 Comm: devlink Not tainted 6.1.0-07460-g7ae9888d6e1c #580
RIP: 0010:devlink_region_snapshot_del+0x12e/0x140
Call Trace:
<TASK>
devl_region_destroy+0x70/0x140
nsim_dev_reload_down+0x2f/0x60 [netdevsim]
devlink_reload+0x1f7/0x360
devlink_nl_cmd_reload+0x6ce/0x860
genl_family_rcv_msg_doit.isra.0+0x145/0x1c0
This is the locking assert in devlink_region_snapshot_del(),
we're supposed to be holding the region->snapshot_lock here.
Fixes: 2dec18ad826f ("net: devlink: remove region snapshots list dependency on devlink->lock")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/devlink.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c index 89baa7c0938b..e8f1af4231db 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -11435,8 +11435,10 @@ void devl_region_destroy(struct devlink_region *region) devl_assert_locked(devlink); /* Free all snapshots of region */ + mutex_lock(®ion->snapshot_lock); list_for_each_entry_safe(snapshot, ts, ®ion->snapshot_list, list) devlink_region_snapshot_del(region, snapshot); + mutex_unlock(®ion->snapshot_lock); list_del(®ion->list); mutex_destroy(®ion->snapshot_lock); |