mac80211: clean up aggregation destruction
authorJohannes Berg <johannes.berg@intel.com>
Tue, 17 Jan 2012 09:30:01 +0000 (10:30 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 24 Jan 2012 19:21:15 +0000 (14:21 -0500)
Yogesh's patch to destroy aggregation sessions when
stations are destroyed was needed, but unnecessarily
complex. Clean up this code.

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

index ff11f6b..a090004 100644 (file)
@@ -815,35 +815,20 @@ static int __must_check __sta_info_destroy(struct sta_info *sta)
        }
 #endif
 
-       /* There could be some memory leaks because of ampdu tx pending queue
-        * not being freed before destroying the station info.
-        *
-        * Make sure that such queues are purged before freeing the station
-        * info.
-        * TODO: We have to somehow postpone the full destruction
-        * until the aggregation stop completes. Refer
-        * http://thread.gmane.org/gmane.linux.kernel.wireless.general/81936
+       /*
+        * Destroy aggregation state here. It would be nice to wait for the
+        * driver to finish aggregation stop and then clean up, but for now
+        * drivers have to handle aggregation stop being requested, followed
+        * directly by station destruction.
         */
-
-       mutex_lock(&sta->ampdu_mlme.mtx);
-
        for (i = 0; i < STA_TID_NUM; i++) {
-               tid_tx = rcu_dereference_protected_tid_tx(sta, i);
+               tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]);
                if (!tid_tx)
                        continue;
-               if (skb_queue_len(&tid_tx->pending)) {
-#ifdef CONFIG_MAC80211_HT_DEBUG
-                       wiphy_debug(local->hw.wiphy, "TX A-MPDU  purging %d "
-                               "packets for tid=%d\n",
-                               skb_queue_len(&tid_tx->pending), i);
-#endif /* CONFIG_MAC80211_HT_DEBUG */
-                       __skb_queue_purge(&tid_tx->pending);
-               }
-               kfree_rcu(tid_tx, rcu_head);
+               __skb_queue_purge(&tid_tx->pending);
+               kfree(tid_tx);
        }
 
-       mutex_unlock(&sta->ampdu_mlme.mtx);
-
        sta_info_free(local, sta);
 
        return 0;