- fix ath10k latency issues - reject too large weight values - code cleanup Signed-off-by: Felix Fietkau <nbd@nbd.name>
81 lines
2.3 KiB
Diff
81 lines
2.3 KiB
Diff
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;
|