aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel
diff options
context:
space:
mode:
authorToke Høiland-Jørgensen <toke@toke.dk>2016-12-19 13:59:15 +0100
committerFelix Fietkau <nbd@nbd.name>2016-12-19 13:59:32 +0100
commit47bc081e76f6b04c0e9db687c8abb78eb437021f (patch)
treef101308dbad4b2b01f6047c7a10168a7654c98be /package/kernel
parentb3a871dd3dc1bb78225d60db2d5bcc808b79181f (diff)
downloadupstream-47bc081e76f6b04c0e9db687c8abb78eb437021f.tar.gz
upstream-47bc081e76f6b04c0e9db687c8abb78eb437021f.tar.bz2
upstream-47bc081e76f6b04c0e9db687c8abb78eb437021f.zip
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 <toke@toke.dk> Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'package/kernel')
-rw-r--r--package/kernel/mac80211/patches/344-ath9k-Introduce-airtime-fairness-scheduling-between-.patch35
-rw-r--r--package/kernel/mac80211/patches/345-ath9k-Turn-ath_txq_lock-unlock-into-static-inlines.patch62
-rw-r--r--package/kernel/mac80211/patches/530-ath9k_extra_leds.patch6
-rw-r--r--package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch4
-rw-r--r--package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch2
-rw-r--r--package/kernel/mac80211/patches/554-ath9k-consistently-use-get_eeprom_rev-ah.patch2
6 files changed, 104 insertions, 7 deletions
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?= <toke@toke.dk>
+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 <toke@toke.dk>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+---
+
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?= <toke@toke.dk>
+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 <toke@toke.dk>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+---
+
+--- 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 <nbd@nbd.name>
#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 <nbd@nbd.name>
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 <nbd@nbd.name>
---
--- 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 <martin.blumenstingl@googlemail.com>
&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;