aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/main.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-01-23 16:54:03 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-01-29 16:01:45 -0500
commitc771c9d8da1e8292ef8bf7fd4ce135dacc650130 (patch)
tree79b259a6b0396cbecf9e775c7ba5a80e2c4d94c9 /net/mac80211/main.c
parent506d03f97d10e54fd27c58c872a98242326d6419 (diff)
mac80211: add interface list lock
Using only the RTNL has a number of problems, most notably that ieee80211_iterate_active_interfaces() and other interface list traversals cannot be done from the internal workqueue because it needs to be flushed under the RTNL. This patch introduces a new mutex that protects the interface list against modifications. A more detailed explanation is part of the code change. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r--net/mac80211/main.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 210dfe3cf6c3..a109c06e8e4e 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -758,6 +758,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
758 local->hw.conf.radio_enabled = true; 758 local->hw.conf.radio_enabled = true;
759 759
760 INIT_LIST_HEAD(&local->interfaces); 760 INIT_LIST_HEAD(&local->interfaces);
761 mutex_init(&local->iflist_mtx);
761 762
762 spin_lock_init(&local->key_lock); 763 spin_lock_init(&local->key_lock);
763 764
@@ -1008,6 +1009,8 @@ void ieee80211_free_hw(struct ieee80211_hw *hw)
1008{ 1009{
1009 struct ieee80211_local *local = hw_to_local(hw); 1010 struct ieee80211_local *local = hw_to_local(hw);
1010 1011
1012 mutex_destroy(&local->iflist_mtx);
1013
1011 wiphy_free(local->hw.wiphy); 1014 wiphy_free(local->hw.wiphy);
1012} 1015}
1013EXPORT_SYMBOL(ieee80211_free_hw); 1016EXPORT_SYMBOL(ieee80211_free_hw);