mac80211: add a few performance improvement patches
[openwrt/staging/blogic.git] / package / kernel / mac80211 / patches / subsys / 355-mac80211-run-late-dequeue-late-tx-handlers-without-h.patch
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 (file)
index 0000000..3127c86
--- /dev/null
@@ -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);