]> git.baikalelectronics.ru Git - kernel.git/commit
mac80211: don't cancel csa finalize work within stop_ap
authorSimon Wunderlich <sw@simonwunderlich.de>
Thu, 21 Nov 2013 17:19:52 +0000 (18:19 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 2 Dec 2013 10:51:54 +0000 (11:51 +0100)
commitb56a011694f11767f25505c3c8ececa47c06cdf9
tree42f8a1a5019060b18543852f049b9f9043c1159c
parent1d760b11782abce9b89b217693bf72e5a16b3e9e
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>
net/mac80211/cfg.c