mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
56 lines
1.2 KiB
Diff
56 lines
1.2 KiB
Diff
|
From: Felix Fietkau <nbd@nbd.name>
|
||
|
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 <nbd@nbd.name>
|
||
|
---
|
||
|
|
||
|
--- 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);
|