Skip to content

Commit

Permalink
wifi: nl80211: fix deadlock in nl80211_set_cqm_rssi (6.6.x)
Browse files Browse the repository at this point in the history
Commit 008afb9f3d57 ("wifi: cfg80211: fix CQM for non-range use"
backported to 6.6.x) causes nl80211_set_cqm_rssi not to release the
wdev lock in some of the error paths.

Of course, the ensuing deadlock causes userland network managers to
break pretty badly, and on typical systems this also causes lockups on
on suspend, poweroff and reboot. See [1], [2], [3] for example reports.

The upstream commit 7e7efdd ("wifi: cfg80211: fix CQM for non-range
use"), committed in November 2023, is completely fine because there was
another commit in August 2023 that removed the wdev lock:
see commit 076fc87 ("wifi: cfg80211: remove wdev mutex").

The reason things broke in 6.6.5 is that commit 4338058f6009 was applied
without also applying 076fc87.

Commit 076fc87 ("wifi: cfg80211: remove wdev mutex") is a rather
large commit; adjusting the error handling (which is what this commit does)
yields a much simpler patch and was tested to work properly.

Fix the deadlock by releasing the lock before returning.

[1] https://bugzilla.kernel.org/show_bug.cgi?id=218247
[2] https://bbs.archlinux.org/viewtopic.php?id=290976
[3] https://lore.kernel.org/all/[email protected]/

Link: https://lore.kernel.org/stable/[email protected]/
Fixes: 008afb9f3d57 ("wifi: cfg80211: fix CQM for non-range use")
Tested-by: "Léo Lam" <[email protected]>
Tested-by: Philip Müller <[email protected]>
Cc: [email protected]
Cc: Johannes Berg <[email protected]>
Signed-off-by: "Léo Lam" <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
leoetlino authored and gregkh committed Jan 5, 2024
1 parent d673099 commit e904e81
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -12906,17 +12906,23 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
lockdep_is_held(&wdev->mtx));

/* if already disabled just succeed */
if (!n_thresholds && !old)
return 0;
if (!n_thresholds && !old) {
err = 0;
goto unlock;
}

if (n_thresholds > 1) {
if (!wiphy_ext_feature_isset(&rdev->wiphy,
NL80211_EXT_FEATURE_CQM_RSSI_LIST) ||
!rdev->ops->set_cqm_rssi_range_config)
return -EOPNOTSUPP;
!rdev->ops->set_cqm_rssi_range_config) {
err = -EOPNOTSUPP;
goto unlock;
}
} else {
if (!rdev->ops->set_cqm_rssi_config)
return -EOPNOTSUPP;
if (!rdev->ops->set_cqm_rssi_config) {
err = -EOPNOTSUPP;
goto unlock;
}
}

if (n_thresholds) {
Expand Down

0 comments on commit e904e81

Please sign in to comment.