2021-05-28 06:33:25

by Ryder Lee

[permalink] [raw]
Subject: [PATCH v2 1/4] 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 <[email protected]>
---
change since v2 - roll ieee80211_tx_h_rate_ctrl checks into one condition
---
net/mac80211/tx.c | 52 ++++++++++++++++++++++++++---------------------
1 file changed, 29 insertions(+), 23 deletions(-)

diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 0b719f3d2dec..d3016c3a3069 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1768,8 +1768,6 @@ static int invoke_tx_handlers_early(struct ieee80211_tx_data *tx)
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)) {
@@ -1802,6 +1800,9 @@ static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx)
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);
@@ -3369,15 +3370,21 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,
* 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;

@@ -3426,6 +3433,8 @@ static void ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata,
break;
}
}
+
+ return TX_CONTINUE;
}

static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
@@ -3529,24 +3538,17 @@ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
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,
@@ -3663,8 +3665,12 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
(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;
--
2.18.0


2021-06-10 11:12:48

by Felix Fietkau

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue

On 2021-05-28 08:05, Ryder Lee wrote:
> 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 <[email protected]>
For the mac80211 patches:
Acked-by: Felix Fietkau <[email protected]>

2021-06-17 02:31:07

by Ryder Lee

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue

On Thu, 2021-06-10 at 13:10 +0200, Felix Fietkau wrote:
> On 2021-05-28 08:05, Ryder Lee wrote:
> > 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 <[email protected]>
> For the mac80211 patches:
> Acked-by: Felix Fietkau <[email protected]>

Hi Johannes,

Does this series look okay to you?

Ryder

2021-06-17 10:53:14

by Felix Fietkau

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue


On 2021-05-28 08:05, Ryder Lee wrote:
> 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 <[email protected]>
> ---
> change since v2 - roll ieee80211_tx_h_rate_ctrl checks into one condition
There were some OpenWrt crash reported which appear to be related to
this patch. I was able to reproduce a deadlock with ath9k, and I'm
currently looking into it.

- Felix

2021-06-17 19:45:23

by Felix Fietkau

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue

On 2021-06-17 12:50, Felix Fietkau wrote:
>
> On 2021-05-28 08:05, Ryder Lee wrote:
>> 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 <[email protected]>
>> ---
>> change since v2 - roll ieee80211_tx_h_rate_ctrl checks into one condition
> There were some OpenWrt crash reported which appear to be related to
> this patch. I was able to reproduce a deadlock with ath9k, and I'm
> currently looking into it.
Some more information about the crash:
- ath9k calls ieee80211_tx_dequeue with the tx queue lock held
- ieee80211_tx_dequeue calls minstrel get_rate
- get_rate calls minstrel_aggr_check
- minstrel_aggr check calls ieee80211_start_tx_ba_session
- ieee80211_start_tx_ba_session tries to send a frame
- ath9k tries to acquire the tx lock it already holds

I've fixed this in v3 by moving the logic of minstrel_aggr_check into
mac80211

- Felix