--- /dev/null
+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);