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 <nbd@nbd.name> Link: https://lore.kernel.org/r/20200724182816.18678-1-nbd@nbd.name Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
1303a51c24
Коммит
3ff901cb5d
|
@ -551,7 +551,7 @@ EXPORT_SYMBOL_GPL(ieee80211_calc_tx_airtime);
|
|||
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(struct ieee80211_hw *hw,
|
|||
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)
|
||||
|
|
|
@ -2290,7 +2290,7 @@ extern const struct ethtool_ops ieee80211_ethtool_ops;
|
|||
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 CONFIG_MAC80211_NOINLINE
|
||||
#define debug_noinline noinline
|
||||
#else
|
||||
|
|
|
@ -3722,10 +3722,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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче