diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-12-14 08:56:03 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-01-03 07:01:31 -0500 |
commit | 75de9113bb9dc4939a7cd54e4bdfad555b35f5b1 (patch) | |
tree | fdc5609f042781ce035e5e88272809db81f5493c /net/mac80211/sta_info.h | |
parent | 361c9c8b0eeeec7d881e018d5143bf883558c566 (diff) |
mac80211: optimise AP stop RCU handling
If there are VLANs, stopping an AP is inefficient as it
calls rcu_barrier() once for each interface (the VLANs
and the AP itself). Optimise this by moving rcu_barrier()
out of the station cleanups and calling it only once for
all interfaces combined.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/sta_info.h')
-rw-r--r-- | net/mac80211/sta_info.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index c3266aed4a07..031e4a5bbeca 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
@@ -549,6 +549,19 @@ void sta_info_recalc_tim(struct sta_info *sta); | |||
549 | void sta_info_init(struct ieee80211_local *local); | 549 | void sta_info_init(struct ieee80211_local *local); |
550 | void sta_info_stop(struct ieee80211_local *local); | 550 | void sta_info_stop(struct ieee80211_local *local); |
551 | int sta_info_flush_defer(struct ieee80211_sub_if_data *sdata); | 551 | int sta_info_flush_defer(struct ieee80211_sub_if_data *sdata); |
552 | |||
553 | /** | ||
554 | * sta_info_flush_cleanup - flush the sta_info cleanup queue | ||
555 | * @sdata: the interface | ||
556 | * | ||
557 | * Flushes the sta_info cleanup queue for a given interface; | ||
558 | * this is necessary before the interface is removed or, for | ||
559 | * AP/mesh interfaces, before it is deconfigured. | ||
560 | * | ||
561 | * Note an rcu_barrier() must precede the function, after all | ||
562 | * stations have been flushed/removed to ensure the call_rcu() | ||
563 | * calls that add stations to the cleanup queue have completed. | ||
564 | */ | ||
552 | void sta_info_flush_cleanup(struct ieee80211_sub_if_data *sdata); | 565 | void sta_info_flush_cleanup(struct ieee80211_sub_if_data *sdata); |
553 | 566 | ||
554 | /** | 567 | /** |
@@ -562,6 +575,7 @@ static inline int sta_info_flush(struct ieee80211_sub_if_data *sdata) | |||
562 | { | 575 | { |
563 | int ret = sta_info_flush_defer(sdata); | 576 | int ret = sta_info_flush_defer(sdata); |
564 | 577 | ||
578 | rcu_barrier(); | ||
565 | sta_info_flush_cleanup(sdata); | 579 | sta_info_flush_cleanup(sdata); |
566 | 580 | ||
567 | return ret; | 581 | return ret; |