|
@@ -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;
|