From: Felix Fietkau 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 --- --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3518,6 +3518,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) || @@ -3534,11 +3535,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); @@ -3602,8 +3604,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) && @@ -3642,6 +3647,7 @@ begin: } IEEE80211_SKB_CB(skb)->control.vif = vif; + return skb; out: spin_unlock_bh(&fq->lock);