mac80211: fix station destruction in AP/mesh modes
authorJohannes Berg <johannes.berg@intel.com>
Thu, 13 Dec 2012 21:54:58 +0000 (22:54 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 3 Jan 2013 11:59:59 +0000 (12:59 +0100)
commit97f97b1f5fe0878b35c8e314f98591771696321b
treed51b86324030567fe51f9112c2d9d2242e07c008
parentb7cfcd113ac2a1e6b02afc7d283295729fc178a9
mac80211: fix station destruction in AP/mesh modes

Unfortunately, commit b22cfcfcae5b, intended to speed up roaming
by avoiding the synchronize_rcu() broke AP/mesh modes as it moved
some code into that work item that will still call into the driver
at a time where it's no longer expected to handle this: after the
AP or mesh has been stopped.

To fix this problem remove the per-station work struct, maintain a
station cleanup list instead and flush this list when stations are
flushed. To keep this patch smaller for stable, do this when the
stations are flushed (sta_info_flush()). This unfortunately brings
back the original roaming delay; I'll fix that again in a separate
patch.

Also, Ben reported that the original commit could sometimes (with
many interfaces) cause long delays when an interface is set down,
due to blocking on flush_workqueue(). Since we now maintain the
cleanup list, this particular change of the original patch can be
reverted.

Cc: stable@vger.kernel.org [3.7]
Reported-by: Ben Greear <greearb@candelatech.com>
Tested-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h