From: Toke Høiland-Jørgensen Date: Mon, 19 Dec 2016 12:59:15 +0000 (+0100) Subject: ath9k: Add airtime fairness scheduler X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=47bc081e76f6b04c0e9db687c8abb78eb437021f;p=openwrt%2Fstaging%2Fluka.git ath9k: Add airtime fairness scheduler This adds a patch that introduces airtime fairness scheduling to ath9k, which can significantly improve network efficiency in mixed-rate environments. Signed-off-by: Toke Høiland-Jørgensen Signed-off-by: Felix Fietkau --- diff --git a/package/kernel/mac80211/patches/344-ath9k-Introduce-airtime-fairness-scheduling-between-.patch b/package/kernel/mac80211/patches/344-ath9k-Introduce-airtime-fairness-scheduling-between-.patch new file mode 100644 index 0000000000..57ce3d8f8b --- /dev/null +++ b/package/kernel/mac80211/patches/344-ath9k-Introduce-airtime-fairness-scheduling-between-.patch @@ -0,0 +1,35 @@ +From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= +Date: Mon, 5 Dec 2016 13:27:37 +0200 +Subject: [PATCH] ath9k: Introduce airtime fairness scheduling between stations +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reworks the ath9k driver to schedule transmissions to connected +stations in a way that enforces airtime fairness between them. It +accomplishes this by measuring the time spent transmitting to or +receiving from a station at TX and RX completion, and accounting this to +a per-station, per-QoS level airtime deficit. Then, an FQ-CoDel based +deficit scheduler is employed at packet dequeue time, to control which +station gets the next transmission opportunity. + +Airtime fairness can significantly improve the efficiency of the network +when station rates vary. The following throughput values are from a +simple three-station test scenario, where two stations operate at the +highest HT20 rate, and one station at the lowest, and the scheduler is +employed at the access point: + + Before / After +Fast station 1: 19.17 / 25.09 Mbps +Fast station 2: 19.83 / 25.21 Mbps +Slow station: 2.58 / 1.77 Mbps +Total: 41.58 / 52.07 Mbps + +The benefit of airtime fairness goes up the more stations are present. +In a 30-station test with one station artificially limited to 1 Mbps, +we have seen aggregate throughput go from 2.14 to 17.76 Mbps. + +Signed-off-by: Toke Høiland-Jørgensen +Signed-off-by: Kalle Valo +--- + diff --git a/package/kernel/mac80211/patches/345-ath9k-Turn-ath_txq_lock-unlock-into-static-inlines.patch b/package/kernel/mac80211/patches/345-ath9k-Turn-ath_txq_lock-unlock-into-static-inlines.patch new file mode 100644 index 0000000000..7fe2c78037 --- /dev/null +++ b/package/kernel/mac80211/patches/345-ath9k-Turn-ath_txq_lock-unlock-into-static-inlines.patch @@ -0,0 +1,62 @@ +From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= +Date: Mon, 5 Dec 2016 13:27:38 +0200 +Subject: [PATCH] ath9k: Turn ath_txq_lock/unlock() into static inlines. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +These are one-line functions that just call spin_lock/unlock_bh(); turn +them into static inlines to avoid the function call overhead. + +Signed-off-by: Toke Høiland-Jørgensen +Signed-off-by: Kalle Valo +--- + +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -558,6 +558,15 @@ static inline void ath_chanctx_check_act + + #endif /* CPTCFG_ATH9K_CHANNEL_CONTEXT */ + ++static inline void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq) ++{ ++ spin_lock_bh(&txq->axq_lock); ++} ++static inline void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq) ++{ ++ spin_unlock_bh(&txq->axq_lock); ++} ++ + void ath_startrecv(struct ath_softc *sc); + bool ath_stoprecv(struct ath_softc *sc); + u32 ath_calcrxfilter(struct ath_softc *sc); +@@ -565,8 +574,6 @@ int ath_rx_init(struct ath_softc *sc, in + void ath_rx_cleanup(struct ath_softc *sc); + int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp); + struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); +-void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq); +-void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq); + void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq); + void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); + bool ath_drain_all_txq(struct ath_softc *sc); +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -98,18 +98,6 @@ static void ath_tx_status(struct ieee802 + dev_kfree_skb(skb); + } + +-void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq) +- __acquires(&txq->axq_lock) +-{ +- spin_lock_bh(&txq->axq_lock); +-} +- +-void ath_txq_unlock(struct ath_softc *sc, struct ath_txq *txq) +- __releases(&txq->axq_lock) +-{ +- spin_unlock_bh(&txq->axq_lock); +-} +- + void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq) + __releases(&txq->axq_lock) + { diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch index 3fbe316690..8ceed72d1c 100644 --- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch +++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -827,6 +827,9 @@ static inline int ath9k_dump_btcoex(stru +@@ -837,6 +837,9 @@ static inline int ath9k_dump_btcoex(stru #ifdef CPTCFG_MAC80211_LEDS void ath_init_leds(struct ath_softc *sc); void ath_deinit_leds(struct ath_softc *sc); @@ -10,7 +10,7 @@ #else static inline void ath_init_leds(struct ath_softc *sc) { -@@ -963,6 +966,13 @@ void ath_ant_comb_scan(struct ath_softc +@@ -973,6 +976,13 @@ void ath_ant_comb_scan(struct ath_softc #define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */ @@ -24,7 +24,7 @@ struct ath_softc { struct ieee80211_hw *hw; struct device *dev; -@@ -1015,9 +1025,8 @@ struct ath_softc { +@@ -1025,9 +1035,8 @@ struct ath_softc { spinlock_t chan_lock; #ifdef CPTCFG_MAC80211_LEDS diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch index 1330dfed8b..67a58587c6 100644 --- a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch +++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch @@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau #include "common.h" #include "debug.h" -@@ -973,6 +974,14 @@ struct ath_led { +@@ -983,6 +984,14 @@ struct ath_led { struct led_classdev cdev; }; @@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau struct ath_softc { struct ieee80211_hw *hw; struct device *dev; -@@ -1027,6 +1036,9 @@ struct ath_softc { +@@ -1037,6 +1046,9 @@ struct ath_softc { #ifdef CPTCFG_MAC80211_LEDS const char *led_default_trigger; struct list_head leds; diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch index f86b0152ea..a914a15bb7 100644 --- a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch +++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h -@@ -1038,6 +1038,7 @@ struct ath_softc { +@@ -1048,6 +1048,7 @@ struct ath_softc { struct list_head leds; #ifdef CONFIG_GPIOLIB struct ath9k_gpio_chip *gpiochip; diff --git a/package/kernel/mac80211/patches/554-ath9k-consistently-use-get_eeprom_rev-ah.patch b/package/kernel/mac80211/patches/554-ath9k-consistently-use-get_eeprom_rev-ah.patch index 64e70467a3..93f768b7e1 100644 --- a/package/kernel/mac80211/patches/554-ath9k-consistently-use-get_eeprom_rev-ah.patch +++ b/package/kernel/mac80211/patches/554-ath9k-consistently-use-get_eeprom_rev-ah.patch @@ -329,7 +329,7 @@ Signed-off-by: Martin Blumenstingl &ratesArray[0], cfgCtl, --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -1177,8 +1177,9 @@ static u8 ath_get_rate_txpower(struct at +@@ -1165,8 +1165,9 @@ static u8 ath_get_rate_txpower(struct at if (is_40) { u8 power_ht40delta; struct ar5416_eeprom_def *eep = &ah->eeprom.def;