diff options
author | Michael Wu <flamingice@sourmilk.net> | 2007-07-27 09:43:23 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:47:37 -0400 |
commit | be8755e1804d6f60e6a96a46ac6bc46ce6dfca53 (patch) | |
tree | a3038a924114f49aa2372ab7c9417d4e072c4b20 /net/mac80211/ieee80211.c | |
parent | c2d1560ad8c2f6e0dd0d34102d022f3709325c26 (diff) |
[MAC80211]: improve locking of sta_info related structures
The sta_info code has some awkward locking which prevents some driver
callbacks from being allowed to sleep. This patch makes the locking more
focused so code that calls driver callbacks are allowed to sleep. It also
converts sta_lock to a rwlock.
Signed-off-by: Michael Wu <flamingice@sourmilk.net>
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/ieee80211.c')
-rw-r--r-- | net/mac80211/ieee80211.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 1981058907b7..566bdca32b86 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -628,8 +628,8 @@ int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr) | |||
628 | /* Remove STA entry for the old peer */ | 628 | /* Remove STA entry for the old peer */ |
629 | sta = sta_info_get(local, sdata->u.wds.remote_addr); | 629 | sta = sta_info_get(local, sdata->u.wds.remote_addr); |
630 | if (sta) { | 630 | if (sta) { |
631 | sta_info_free(sta); | ||
631 | sta_info_put(sta); | 632 | sta_info_put(sta); |
632 | sta_info_free(sta, 0); | ||
633 | } else { | 633 | } else { |
634 | printk(KERN_DEBUG "%s: could not find STA entry for WDS link " | 634 | printk(KERN_DEBUG "%s: could not find STA entry for WDS link " |
635 | "peer " MAC_FMT "\n", | 635 | "peer " MAC_FMT "\n", |
@@ -776,13 +776,13 @@ static void ieee80211_stat_refresh(unsigned long data) | |||
776 | return; | 776 | return; |
777 | 777 | ||
778 | /* go through all stations */ | 778 | /* go through all stations */ |
779 | spin_lock_bh(&local->sta_lock); | 779 | read_lock_bh(&local->sta_lock); |
780 | list_for_each_entry(sta, &local->sta_list, list) { | 780 | list_for_each_entry(sta, &local->sta_list, list) { |
781 | sta->channel_use = (sta->channel_use_raw / local->stat_time) / | 781 | sta->channel_use = (sta->channel_use_raw / local->stat_time) / |
782 | CHAN_UTIL_PER_10MS; | 782 | CHAN_UTIL_PER_10MS; |
783 | sta->channel_use_raw = 0; | 783 | sta->channel_use_raw = 0; |
784 | } | 784 | } |
785 | spin_unlock_bh(&local->sta_lock); | 785 | read_unlock_bh(&local->sta_lock); |
786 | 786 | ||
787 | /* go through all subinterfaces */ | 787 | /* go through all subinterfaces */ |
788 | read_lock(&local->sub_if_lock); | 788 | read_lock(&local->sub_if_lock); |