Skip to content

Commit b5a48f0

Browse files
Thomas Pedersengregkh
authored andcommitted
mac80211: mesh: fix RCU warning
[ Upstream commit 551842446ed695641a00782cd118cbb064a416a1 ] ifmsh->csa is an RCU-protected pointer. The writer context in ieee80211_mesh_finish_csa() is already mutually exclusive with wdev->sdata.mtx, but the RCU checker did not know this. Use rcu_dereference_protected() to avoid a warning. fixes the following warning: [ 12.519089] ============================= [ 12.520042] WARNING: suspicious RCU usage [ 12.520652] 5.1.0-rc7-wt+ OnePlusOSS#16 Tainted: G W [ 12.521409] ----------------------------- [ 12.521972] net/mac80211/mesh.c:1223 suspicious rcu_dereference_check() usage! [ 12.522928] other info that might help us debug this: [ 12.523984] rcu_scheduler_active = 2, debug_locks = 1 [ 12.524855] 5 locks held by kworker/u8:2/152: [ 12.525438] #0: 00000000057be08c ((wq_completion)phy0){+.+.}, at: process_one_work+0x1a2/0x620 [ 12.526607] OnePlusOSS#1: 0000000059c6b07a ((work_completion)(&sdata->csa_finalize_work)){+.+.}, at: process_one_work+0x1a2/0x620 [ 12.528001] OnePlusOSS#2: 00000000f184ba7d (&wdev->mtx){+.+.}, at: ieee80211_csa_finalize_work+0x2f/0x90 [ 12.529116] OnePlusOSS#3: 00000000831a1f54 (&local->mtx){+.+.}, at: ieee80211_csa_finalize_work+0x47/0x90 [ 12.530233] OnePlusOSS#4: 00000000fd06f988 (&local->chanctx_mtx){+.+.}, at: ieee80211_csa_finalize_work+0x51/0x90 Signed-off-by: Thomas Pedersen <thomas@eero.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent d193f70 commit b5a48f0

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

net/mac80211/mesh.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1209,7 +1209,8 @@ int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata)
12091209
ifmsh->chsw_ttl = 0;
12101210

12111211
/* Remove the CSA and MCSP elements from the beacon */
1212-
tmp_csa_settings = rcu_dereference(ifmsh->csa);
1212+
tmp_csa_settings = rcu_dereference_protected(ifmsh->csa,
1213+
lockdep_is_held(&sdata->wdev.mtx));
12131214
RCU_INIT_POINTER(ifmsh->csa, NULL);
12141215
if (tmp_csa_settings)
12151216
kfree_rcu(tmp_csa_settings, rcu_head);
@@ -1231,6 +1232,8 @@ int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata,
12311232
struct mesh_csa_settings *tmp_csa_settings;
12321233
int ret = 0;
12331234

1235+
lockdep_assert_held(&sdata->wdev.mtx);
1236+
12341237
tmp_csa_settings = kmalloc(sizeof(*tmp_csa_settings),
12351238
GFP_ATOMIC);
12361239
if (!tmp_csa_settings)

0 commit comments

Comments
 (0)