From: Toke Høiland-Jørgensen Date: Fri, 23 Sep 2016 19:59:11 +0000 (+0200) Subject: mac80211: Set lower memory limit for non-VHT devices X-Git-Tag: v4.9-rc1~127^2~1^2~4 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=3ff23cd5654b9c8f4d567caa73439b4c39fbeaae;p=karo-tx-linux.git mac80211: Set lower memory limit for non-VHT devices Small devices can run out of memory from queueing too many packets. If VHT is not supported by the PHY, having more than 4 MBytes of total queue in the TXQ intermediate queues is not needed, and so we can safely limit the memory usage in these cases and avoid OOM. Signed-off-by: Toke Høiland-Jørgensen Signed-off-by: Johannes Berg --- diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index e8c996463b11..378a7a6b6dbe 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -1433,6 +1433,8 @@ int ieee80211_txq_setup_flows(struct ieee80211_local *local) struct fq *fq = &local->fq; int ret; int i; + bool supp_vht = false; + enum nl80211_band band; if (!local->ops->wake_tx_queue) return 0; @@ -1441,6 +1443,23 @@ int ieee80211_txq_setup_flows(struct ieee80211_local *local) if (ret) return ret; + /* + * If the hardware doesn't support VHT, it is safe to limit the maximum + * queue size. 4 Mbytes is 64 max-size aggregates in 802.11n. + */ + for (band = 0; band < NUM_NL80211_BANDS; band++) { + struct ieee80211_supported_band *sband; + + sband = local->hw.wiphy->bands[band]; + if (!sband) + continue; + + supp_vht = supp_vht || sband->vht_cap.vht_supported; + } + + if (!supp_vht) + fq->memory_limit = 4 << 20; /* 4 Mbytes */ + codel_params_init(&local->cparams); local->cparams.interval = MS2TIME(100); local->cparams.target = MS2TIME(20);