mac80211: limit TID buffering to prevent out-of-memory issues on low-memory systems
authorFelix Fietkau <nbd@openwrt.org>
Sat, 10 Mar 2012 13:31:31 +0000 (13:31 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 10 Mar 2012 13:31:31 +0000 (13:31 +0000)
SVN-Revision: 30870

package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/563-mac80211_optimize_mcs_rate_mask.patch

index 0ca6a02b5f30c50fdc000a8d23e7b46412e9bda9..25d3b1744154fcee889a94db2e8c586a9e879763 100644 (file)
  #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
                printk(KERN_DEBUG "STA %pM aid %d: PS buffer for AC %d\n",
                       sta->sta.addr, sta->sta.aid, ac);
+@@ -1060,6 +1065,7 @@ static bool ieee80211_tx_prep_agg(struct
+ {
+       bool queued = false;
+       bool reset_agg_timer = false;
++      struct sk_buff *purge_skb = NULL;
+       if (test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) {
+               info->flags |= IEEE80211_TX_CTL_AMPDU;
+@@ -1101,8 +1107,13 @@ static bool ieee80211_tx_prep_agg(struct
+                       info->control.vif = &tx->sdata->vif;
+                       info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
+                       __skb_queue_tail(&tid_tx->pending, skb);
++                      if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER)
++                              purge_skb = __skb_dequeue(&tid_tx->pending);
+               }
+               spin_unlock(&tx->sta->lock);
++
++              if (purge_skb)
++                      dev_kfree_skb(purge_skb);
+       }
+       /* reset session timer */
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
 @@ -480,7 +480,7 @@ struct ieee80211_if_ibss {
index 316663856c46ca014eb49d6e598c89bf2f608ff7..534824f09a5e727842538b10ff72d1911101ed9e 100644 (file)
@@ -68,7 +68,7 @@
        txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP ||
                    tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
                    tx->sdata->vif.type == NL80211_IFTYPE_ADHOC);
-@@ -2455,8 +2457,6 @@ struct sk_buff *ieee80211_beacon_get_tim
+@@ -2461,8 +2463,6 @@ struct sk_buff *ieee80211_beacon_get_tim
                txrc.max_rate_idx = -1;
        else
                txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1;