mac80211: avoid races related to suspend flow
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 22 Jan 2015 21:32:46 +0000 (23:32 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 23 Jan 2015 09:54:22 +0000 (10:54 +0100)
commit4afaff176a968457df18eeebc1aad910b6154761
treeb72d595e376af86d6e3217a5d608fb690864cec2
parent14f2ae83d07a0a0d499d4760dd4a1bffd310b6ae
mac80211: avoid races related to suspend flow

When we go to suspend, there is complex set of states that
avoids races. The quiescing variable is set whlie
__ieee80211_suspend is running. Then suspended is set.
The code makes sure there is no window without any of these
flags.

The problem is that workers can still be enqueued while we
are quiescing. This leads to situations where the driver is
already suspending and other flows like disassociation are
handled by a worker.

To fix this, we need to check quiescing and suspended flags
in the worker itself and not only before enqueueing it.
I also add here extensive documentation to ease the
understanding of these complex issues.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/util.c