| From: Felix Fietkau <nbd@nbd.name> |
| Date: Sat, 11 Jun 2022 16:34:32 +0200 |
| Subject: [PATCH] mac80211: improve AQL tx time estimation |
| |
| If airtime cannot be calculated because of missing or unsupported rate info, |
| use the smallest possible non-zero value for estimated tx time. |
| This improves handling of these cases by preventing queueing of as many packets |
| as the driver/hardware queue can hold for these stations. |
| Also slightly improve limiting queueing by explicitly rounding up small values. |
| |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| --- |
| |
| --- a/include/net/mac80211.h |
| +++ b/include/net/mac80211.h |
| @@ -1107,20 +1107,24 @@ struct ieee80211_tx_info { |
| }; |
| }; |
| |
| +#define IEEE80211_TX_TIME_EST_UNIT 4 |
| + |
| +static inline u16 |
| +ieee80211_info_get_tx_time_est(struct ieee80211_tx_info *info) |
| +{ |
| + return info->tx_time_est * IEEE80211_TX_TIME_EST_UNIT; |
| +} |
| + |
| static inline u16 |
| ieee80211_info_set_tx_time_est(struct ieee80211_tx_info *info, u16 tx_time_est) |
| { |
| /* We only have 10 bits in tx_time_est, so store airtime |
| * in increments of 4us and clamp the maximum to 2**12-1 |
| */ |
| - info->tx_time_est = min_t(u16, tx_time_est, 4095) >> 2; |
| - return info->tx_time_est << 2; |
| -} |
| + tx_time_est = DIV_ROUND_UP(tx_time_est, IEEE80211_TX_TIME_EST_UNIT); |
| + info->tx_time_est = min_t(u16, tx_time_est, BIT(10) - 1); |
| |
| -static inline u16 |
| -ieee80211_info_get_tx_time_est(struct ieee80211_tx_info *info) |
| -{ |
| - return info->tx_time_est << 2; |
| + return ieee80211_info_get_tx_time_est(info); |
| } |
| |
| /** |
| --- a/net/mac80211/status.c |
| +++ b/net/mac80211/status.c |
| @@ -999,6 +999,8 @@ static void __ieee80211_tx_status(struct |
| NULL, |
| skb->len, |
| false); |
| + if (!airtime) |
| + airtime = IEEE80211_TX_TIME_EST_UNIT; |
| |
| ieee80211_register_airtime(txq, airtime, 0); |
| } |
| --- a/net/mac80211/tx.c |
| +++ b/net/mac80211/tx.c |
| @@ -3798,13 +3798,12 @@ encap_out: |
| |
| airtime = ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta, |
| skb->len, ampdu); |
| - if (airtime) { |
| - airtime = ieee80211_info_set_tx_time_est(info, airtime); |
| - ieee80211_sta_update_pending_airtime(local, tx.sta, |
| - txq->ac, |
| - airtime, |
| - false); |
| - } |
| + if (!airtime) |
| + airtime = IEEE80211_TX_TIME_EST_UNIT; |
| + |
| + airtime = ieee80211_info_set_tx_time_est(info, airtime); |
| + ieee80211_sta_update_pending_airtime(local, tx.sta, txq->ac, |
| + airtime, false); |
| } |
| |
| return skb; |