aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch')
-rw-r--r--package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch55
1 files changed, 55 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch b/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch
new file mode 100644
index 0000000000..3127c86822
--- /dev/null
+++ b/package/kernel/mac80211/patches/subsys/355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch
@@ -0,0 +1,55 @@
+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);