123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- From: Felix Fietkau <[email protected]>
- Date: Fri, 24 Jul 2020 20:25:07 +0200
- Subject: [PATCH] mac80211: improve AQL tx airtime estimation
- AQL does not take into account that most HT/VHT/HE traffic is A-MPDU aggregated.
- Because of that, the per-packet airtime overhead is vastly overestimated.
- Improve it by assuming an average aggregation length of 16 for non-legacy
- traffic if not using the VO AC queue.
- This should improve performance with high data rates, especially with multiple
- stations
- Signed-off-by: Felix Fietkau <[email protected]>
- ---
- --- a/net/mac80211/airtime.c
- +++ b/net/mac80211/airtime.c
- @@ -551,7 +551,7 @@ EXPORT_SYMBOL_GPL(ieee80211_calc_tx_airt
- u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif,
- struct ieee80211_sta *pubsta,
- - int len)
- + int len, bool ampdu)
- {
- struct ieee80211_supported_band *sband;
- struct ieee80211_chanctx_conf *conf;
- @@ -572,10 +572,26 @@ u32 ieee80211_calc_expected_tx_airtime(s
- if (pubsta) {
- struct sta_info *sta = container_of(pubsta, struct sta_info,
- sta);
- + struct ieee80211_tx_rate *rate = &sta->tx_stats.last_rate;
- + u32 airtime;
-
- - return ieee80211_calc_tx_airtime_rate(hw,
- - &sta->tx_stats.last_rate,
- - band, len);
- + if (!(rate->flags & (IEEE80211_TX_RC_VHT_MCS |
- + IEEE80211_TX_RC_MCS)))
- + ampdu = false;
- +
- + /*
- + * 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.
- + * This will not be very accurate, but much better than simply
- + * assuming un-aggregated tx.
- + */
- + airtime = ieee80211_calc_tx_airtime_rate(hw, rate, band,
- + ampdu ? len * 16 : len);
- + if (ampdu)
- + airtime /= 16;
- +
- + return airtime;
- }
-
- if (!conf)
- --- a/net/mac80211/ieee80211_i.h
- +++ b/net/mac80211/ieee80211_i.h
- @@ -2294,7 +2294,7 @@ extern const struct ethtool_ops ieee8021
- u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif,
- struct ieee80211_sta *pubsta,
- - int len);
- + int len, bool ampdu);
- #ifdef CPTCFG_MAC80211_NOINLINE
- #define debug_noinline noinline
- #else
- --- a/net/mac80211/tx.c
- +++ b/net/mac80211/tx.c
- @@ -3707,10 +3707,11 @@ encap_out:
-
- if (vif &&
- wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) {
- + bool ampdu = txq->ac != IEEE80211_AC_VO;
- u32 airtime;
-
- airtime = ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta,
- - skb->len);
- + skb->len, ampdu);
- if (airtime) {
- airtime = ieee80211_info_set_tx_time_est(info, airtime);
- ieee80211_sta_update_pending_airtime(local, tx.sta,
|