12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- From: Felix Fietkau <[email protected]>
- Date: Sat, 16 Mar 2019 18:00:12 +0100
- Subject: [PATCH] mac80211: run late dequeue late tx handlers without
- holding fq->lock
- Reduces lock contention on enqueue/dequeue of iTXQ packets
- Signed-off-by: Felix Fietkau <[email protected]>
- ---
- --- a/net/mac80211/tx.c
- +++ b/net/mac80211/tx.c
- @@ -3507,6 +3507,7 @@ struct sk_buff *ieee80211_tx_dequeue(str
- ieee80211_tx_result r;
- struct ieee80211_vif *vif = txq->vif;
-
- +begin:
- spin_lock_bh(&fq->lock);
-
- if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags) ||
- @@ -3523,11 +3524,12 @@ struct sk_buff *ieee80211_tx_dequeue(str
- if (skb)
- goto out;
-
- -begin:
- skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func);
- if (!skb)
- goto out;
-
- + spin_unlock_bh(&fq->lock);
- +
- hdr = (struct ieee80211_hdr *)skb->data;
- info = IEEE80211_SKB_CB(skb);
-
- @@ -3573,8 +3575,11 @@ begin:
-
- skb = __skb_dequeue(&tx.skbs);
-
- - if (!skb_queue_empty(&tx.skbs))
- + if (!skb_queue_empty(&tx.skbs)) {
- + spin_lock_bh(&fq->lock);
- skb_queue_splice_tail(&tx.skbs, &txqi->frags);
- + spin_unlock_bh(&fq->lock);
- + }
- }
-
- if (skb && skb_has_frag_list(skb) &&
- @@ -3613,6 +3618,7 @@ begin:
- }
-
- IEEE80211_SKB_CB(skb)->control.vif = vif;
- + return skb;
-
- out:
- spin_unlock_bh(&fq->lock);
|