mac80211: defer TX agg session teardown to work
authorJohannes Berg <johannes.berg@intel.com>
Thu, 10 Jun 2010 08:21:47 +0000 (10:21 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 14 Jun 2010 19:39:28 +0000 (15:39 -0400)
Since we want the code to be able to sleep
in the future, it must not be called from
the timer directly. To achieve that, simply
call the function drivers would call, and
also use RCU in the timer to get the struct
so we don't need to rely on the spinlock in
the future.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/agg-tx.c

index 9a00a79a868bf5b24c1b87052003b0ae504ff4b8..0026604cfe30d60e30c3aef26fcddba65b3dd97c 100644 (file)
@@ -200,11 +200,11 @@ static void sta_addba_resp_timer_expired(unsigned long data)
        struct tid_ampdu_tx *tid_tx;
 
        /* check if the TID waits for addBA response */
-       spin_lock_bh(&sta->lock);
-       tid_tx = sta->ampdu_mlme.tid_tx[tid];
+       rcu_read_lock();
+       tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
        if (!tid_tx ||
            test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) {
-               spin_unlock_bh(&sta->lock);
+               rcu_read_unlock();
 #ifdef CONFIG_MAC80211_HT_DEBUG
                printk(KERN_DEBUG "timer expired on tid %d but we are not "
                                "(or no longer) expecting addBA response there\n",
@@ -217,8 +217,8 @@ static void sta_addba_resp_timer_expired(unsigned long data)
        printk(KERN_DEBUG "addBA response timer expired on tid %d\n", tid);
 #endif
 
-       ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
-       spin_unlock_bh(&sta->lock);
+       ieee80211_stop_tx_ba_session(&sta->sta, tid);
+       rcu_read_unlock();
 }
 
 static inline int ieee80211_ac_from_tid(int tid)