Skip to content

Commit

Permalink
mac80211: run late dequeue late tx handlers without holding fq->lock
Browse files Browse the repository at this point in the history
Reduces lock contention on enqueue/dequeue of iTXQ packets

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Acked-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Felix Fietkau authored and Johannes Berg committed Apr 26, 2019
1 parent f2af2df commit ded4698
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions net/mac80211/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -3535,6 +3535,7 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
ieee80211_tx_result r;
struct ieee80211_vif *vif = txq->vif;

begin:
spin_lock_bh(&fq->lock);

if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags) ||
Expand All @@ -3551,11 +3552,12 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
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);

Expand Down Expand Up @@ -3600,8 +3602,11 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,

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_has_frag_list(skb) &&
Expand Down Expand Up @@ -3640,6 +3645,7 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
}

IEEE80211_SKB_CB(skb)->control.vif = vif;
return skb;

out:
spin_unlock_bh(&fq->lock);
Expand Down

0 comments on commit ded4698

Please sign in to comment.