forked from openwrt/openwrt
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mac80211: improve rate control performance
Call rate control handler after intermediate queueuing Signed-off-by: Felix Fietkau <nbd@nbd.name>
- Loading branch information
Showing
1 changed file
with
114 additions
and
0 deletions.
There are no files selected for viewing
114 changes: 114 additions & 0 deletions
114
...nel/mac80211/patches/subsys/374-mac80211-call-ieee80211_tx_h_rate_ctrl-when-dequeue.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
From: Ryder Lee <ryder.lee@mediatek.com> | ||
Date: Fri, 28 May 2021 14:05:41 +0800 | ||
Subject: [PATCH] mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue | ||
|
||
Make ieee80211_tx_h_rate_ctrl() get called on dequeue to improve | ||
performance since it reduces the turnaround time for rate control. | ||
|
||
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com> | ||
--- | ||
|
||
--- a/net/mac80211/tx.c | ||
+++ b/net/mac80211/tx.c | ||
@@ -1780,8 +1780,6 @@ static int invoke_tx_handlers_early(stru | ||
CALL_TXH(ieee80211_tx_h_ps_buf); | ||
CALL_TXH(ieee80211_tx_h_check_control_port_protocol); | ||
CALL_TXH(ieee80211_tx_h_select_key); | ||
- if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) | ||
- CALL_TXH(ieee80211_tx_h_rate_ctrl); | ||
|
||
txh_done: | ||
if (unlikely(res == TX_DROP)) { | ||
@@ -1814,6 +1812,9 @@ static int invoke_tx_handlers_late(struc | ||
goto txh_done; | ||
} | ||
|
||
+ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) | ||
+ CALL_TXH(ieee80211_tx_h_rate_ctrl); | ||
+ | ||
CALL_TXH(ieee80211_tx_h_michael_mic_add); | ||
CALL_TXH(ieee80211_tx_h_sequence); | ||
CALL_TXH(ieee80211_tx_h_fragment); | ||
@@ -3384,15 +3385,21 @@ out: | ||
* Can be called while the sta lock is held. Anything that can cause packets to | ||
* be generated will cause deadlock! | ||
*/ | ||
-static void ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, | ||
- struct sta_info *sta, u8 pn_offs, | ||
- struct ieee80211_key *key, | ||
- struct sk_buff *skb) | ||
+static ieee80211_tx_result | ||
+ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, | ||
+ struct sta_info *sta, u8 pn_offs, | ||
+ struct ieee80211_key *key, | ||
+ struct ieee80211_tx_data *tx) | ||
{ | ||
+ struct sk_buff *skb = tx->skb; | ||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
struct ieee80211_hdr *hdr = (void *)skb->data; | ||
u8 tid = IEEE80211_NUM_TIDS; | ||
|
||
+ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL) && | ||
+ ieee80211_tx_h_rate_ctrl(tx) != TX_CONTINUE) | ||
+ return TX_DROP; | ||
+ | ||
if (key) | ||
info->control.hw_key = &key->conf; | ||
|
||
@@ -3441,6 +3448,8 @@ static void ieee80211_xmit_fast_finish(s | ||
break; | ||
} | ||
} | ||
+ | ||
+ return TX_CONTINUE; | ||
} | ||
|
||
static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, | ||
@@ -3544,24 +3553,17 @@ static bool ieee80211_xmit_fast(struct i | ||
tx.sta = sta; | ||
tx.key = fast_tx->key; | ||
|
||
- if (!ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { | ||
- tx.skb = skb; | ||
- r = ieee80211_tx_h_rate_ctrl(&tx); | ||
- skb = tx.skb; | ||
- tx.skb = NULL; | ||
- | ||
- if (r != TX_CONTINUE) { | ||
- if (r != TX_QUEUED) | ||
- kfree_skb(skb); | ||
- return true; | ||
- } | ||
- } | ||
- | ||
if (ieee80211_queue_skb(local, sdata, sta, skb)) | ||
return true; | ||
|
||
- ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, | ||
- fast_tx->key, skb); | ||
+ tx.skb = skb; | ||
+ r = ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, | ||
+ fast_tx->key, &tx); | ||
+ tx.skb = NULL; | ||
+ if (r == TX_DROP) { | ||
+ kfree_skb(skb); | ||
+ return true; | ||
+ } | ||
|
||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
sdata = container_of(sdata->bss, | ||
@@ -3672,8 +3674,12 @@ begin: | ||
(tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) | ||
pn_offs = ieee80211_hdrlen(hdr->frame_control); | ||
|
||
- ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, | ||
- tx.key, skb); | ||
+ r = ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, | ||
+ tx.key, &tx); | ||
+ if (r != TX_CONTINUE) { | ||
+ ieee80211_free_txskb(&local->hw, skb); | ||
+ goto begin; | ||
+ } | ||
} else { | ||
if (invoke_tx_handlers_late(&tx)) | ||
goto begin; |