Commit 3ff901cb authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg

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: default avatarFelix Fietkau <nbd@nbd.name>
Link: https://lore.kernel.org/r/20200724182816.18678-1-nbd@nbd.nameSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 1303a51c
...@@ -551,7 +551,7 @@ EXPORT_SYMBOL_GPL(ieee80211_calc_tx_airtime); ...@@ -551,7 +551,7 @@ EXPORT_SYMBOL_GPL(ieee80211_calc_tx_airtime);
u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw, u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *pubsta, struct ieee80211_sta *pubsta,
int len) int len, bool ampdu)
{ {
struct ieee80211_supported_band *sband; struct ieee80211_supported_band *sband;
struct ieee80211_chanctx_conf *conf; struct ieee80211_chanctx_conf *conf;
...@@ -572,10 +572,26 @@ u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw, ...@@ -572,10 +572,26 @@ u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
if (pubsta) { if (pubsta) {
struct sta_info *sta = container_of(pubsta, struct sta_info, struct sta_info *sta = container_of(pubsta, struct sta_info,
sta); sta);
struct ieee80211_tx_rate *rate = &sta->tx_stats.last_rate;
u32 airtime;
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 ieee80211_calc_tx_airtime_rate(hw, return airtime;
&sta->tx_stats.last_rate,
band, len);
} }
if (!conf) if (!conf)
......
...@@ -2290,7 +2290,7 @@ extern const struct ethtool_ops ieee80211_ethtool_ops; ...@@ -2290,7 +2290,7 @@ extern const struct ethtool_ops ieee80211_ethtool_ops;
u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw, u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *pubsta, struct ieee80211_sta *pubsta,
int len); int len, bool ampdu);
#ifdef CONFIG_MAC80211_NOINLINE #ifdef CONFIG_MAC80211_NOINLINE
#define debug_noinline noinline #define debug_noinline noinline
#else #else
......
...@@ -3722,10 +3722,11 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, ...@@ -3722,10 +3722,11 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
if (vif && if (vif &&
wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) { wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) {
bool ampdu = txq->ac != IEEE80211_AC_VO;
u32 airtime; u32 airtime;
airtime = ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta, airtime = ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta,
skb->len); skb->len, ampdu);
if (airtime) { if (airtime) {
airtime = ieee80211_info_set_tx_time_est(info, airtime); airtime = ieee80211_info_set_tx_time_est(info, airtime);
ieee80211_sta_update_pending_airtime(local, tx.sta, ieee80211_sta_update_pending_airtime(local, tx.sta,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment