[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>
This commit is contained in:
committed by
David S. Miller
parent
c2d1560ad8
commit
be8755e180
@@ -417,10 +417,9 @@ struct ieee80211_local {
|
||||
struct sk_buff_head skb_queue_unreliable;
|
||||
|
||||
/* Station data structures */
|
||||
spinlock_t sta_lock; /* mutex for STA data structures */
|
||||
rwlock_t sta_lock; /* protects STA data structures */
|
||||
int num_sta; /* number of stations in sta_list */
|
||||
struct list_head sta_list;
|
||||
struct list_head deleted_sta_list;
|
||||
struct sta_info *sta_hash[STA_HASH_SIZE];
|
||||
struct timer_list sta_cleanup;
|
||||
|
||||
@@ -669,9 +668,9 @@ static inline void __bss_tim_set(struct ieee80211_if_ap *bss, int aid)
|
||||
static inline void bss_tim_set(struct ieee80211_local *local,
|
||||
struct ieee80211_if_ap *bss, int aid)
|
||||
{
|
||||
spin_lock_bh(&local->sta_lock);
|
||||
read_lock_bh(&local->sta_lock);
|
||||
__bss_tim_set(bss, aid);
|
||||
spin_unlock_bh(&local->sta_lock);
|
||||
read_unlock_bh(&local->sta_lock);
|
||||
}
|
||||
|
||||
static inline void __bss_tim_clear(struct ieee80211_if_ap *bss, int aid)
|
||||
@@ -686,9 +685,9 @@ static inline void __bss_tim_clear(struct ieee80211_if_ap *bss, int aid)
|
||||
static inline void bss_tim_clear(struct ieee80211_local *local,
|
||||
struct ieee80211_if_ap *bss, int aid)
|
||||
{
|
||||
spin_lock_bh(&local->sta_lock);
|
||||
read_lock_bh(&local->sta_lock);
|
||||
__bss_tim_clear(bss, aid);
|
||||
spin_unlock_bh(&local->sta_lock);
|
||||
read_unlock_bh(&local->sta_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user