| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- From: Felix Fietkau <[email protected]>
- Date: Wed, 12 Aug 2020 17:07:10 +0200
- Subject: [PATCH] mac80211: improve AQL aggregation estimation for low data
- rates
- Links with low data rates use much smaller aggregates and are much more
- sensitive to latency added by bufferbloat.
- Tune the assumed aggregation length based on the tx rate duration.
- Signed-off-by: Felix Fietkau <[email protected]>
- ---
- --- a/net/mac80211/airtime.c
- +++ b/net/mac80211/airtime.c
- @@ -647,27 +647,41 @@ u32 ieee80211_calc_expected_tx_airtime(s
- if (pubsta) {
- struct sta_info *sta = container_of(pubsta, struct sta_info,
- sta);
- + struct ieee80211_rx_status stat;
- struct ieee80211_tx_rate *rate = &sta->tx_stats.last_rate;
- struct rate_info *ri = &sta->tx_stats.last_rate_info;
- - u32 airtime;
- + u32 duration, overhead;
- + u8 agg_shift;
-
- - if (!(rate->flags & (IEEE80211_TX_RC_VHT_MCS |
- - IEEE80211_TX_RC_MCS)))
- - ampdu = false;
- + if (ieee80211_fill_rx_status(&stat, hw, rate, ri, band, len))
- + return 0;
-
- + if (stat.encoding == RX_ENC_LEGACY || !ampdu)
- + return ieee80211_calc_rx_airtime(hw, &stat, len);
- +
- + duration = ieee80211_get_rate_duration(hw, &stat, &overhead);
- /*
- * Assume that HT/VHT transmission on any AC except VO will
- * use aggregation. Since we don't have reliable reporting
- - * of aggregation length, assume an average of 16.
- + * of aggregation length, assume an average size based on the
- + * tx rate.
- * This will not be very accurate, but much better than simply
- - * assuming un-aggregated tx.
- + * assuming un-aggregated tx in all cases.
- */
- - airtime = ieee80211_calc_tx_airtime_rate(hw, rate, ri, band,
- - ampdu ? len * 16 : len);
- - if (ampdu)
- - airtime /= 16;
- + if (duration > 400) /* <= VHT20 MCS2 1S */
- + agg_shift = 1;
- + else if (duration > 250) /* <= VHT20 MCS3 1S or MCS1 2S */
- + agg_shift = 2;
- + else if (duration > 150) /* <= VHT20 MCS5 1S or MCS3 2S */
- + agg_shift = 3;
- + else
- + agg_shift = 4;
- +
- + duration *= len;
- + duration /= AVG_PKT_SIZE;
- + duration /= 1024;
-
- - return airtime;
- + return duration + (overhead >> agg_shift);
- }
-
- if (!conf)
|