| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- From: Ryder Lee <[email protected]>
- 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 <[email protected]>
- ---
- --- a/net/mac80211/tx.c
- +++ b/net/mac80211/tx.c
- @@ -1768,8 +1768,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)) {
- @@ -1802,6 +1800,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);
- @@ -3391,15 +3392,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;
-
- @@ -3448,6 +3455,8 @@ static void ieee80211_xmit_fast_finish(s
- break;
- }
- }
- +
- + return TX_CONTINUE;
- }
-
- static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
- @@ -3551,24 +3560,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,
- @@ -3685,8 +3687,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;
|