summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Wunderlich <sw@simonwunderlich.de>2013-11-21 18:19:52 +0100
committerJohannes Berg <johannes.berg@intel.com>2013-12-02 11:51:54 +0100
commitbeffd138d358b69bf15f5a46cb18b31a9b37befb (patch)
tree42f8a1a5019060b18543852f049b9f9043c1159c
parente487eaeb076a44c69dc61348cbc903151bb8fcbd (diff)
downloadop-kernel-dev-beffd138d358b69bf15f5a46cb18b31a9b37befb.zip
op-kernel-dev-beffd138d358b69bf15f5a46cb18b31a9b37befb.tar.gz
mac80211: don't cancel csa finalize work within stop_ap
The current channel switch code has a potential deadlock: 1) * cfg80211_stop_ap acquires wdev-lock * ieee80211_stop_ap calls cancel_work_sync for the csa_finalize_work, which acquires the associated worker-lock 2) * ieee80211_csa_finalize_work holds the worker-lock when run * it calls cfg80211_ch_switch_notify which will claim the wdev-lock, and also needs to claim the sdata-lock (which is the same as the wdev-lock) to modify the beacons. It is sufficient to just set the channel switch active to false. If the worker is running later, it will find the channel switch to not be active anymore and returns immediately without changing anything. Canceling the worker is done anyway when the interface goes down (ieee80211_do_stop). Reported-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/mac80211/cfg.c1
1 files changed, 0 insertions, 1 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 1d446ac9..a66f4f1 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1080,7 +1080,6 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
/* abort any running channel switch */
sdata->vif.csa_active = false;
- cancel_work_sync(&sdata->csa_finalize_work);
cancel_work_sync(&sdata->u.ap.request_smps_work);
/* turn off carrier for this interface and dependent VLANs */
OpenPOWER on IntegriCloud