mt76: usb: reduce locking in mt76u_tx_tasklet
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]
Lorenzo Bianconi
maintainerPATCH v2 1/1 mt76: usb: reduce locking in mt76u_tx_tasklet
Similar to pci counterpart, reduce locking in mt76u_tx_tasklet since q->head is managed just in mt76u_tx_tasklet and q->queued is updated holding q->lock
Signed-off-by Lorenzo Bianconi <[email protected]>
---
Changes since v1:
- drop idx variable
Changes since RFC:
- reset done to false in mt76u_tx_tasklet instead of in mt76u_tx_queue_skb This patch is based on https://patchwork.kernel.org/patch/10856027/
--- drivers/net/wireless/mediatek/mt76/usb.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/usb.c +12 -8
@@ -624,28 +624,33 @@ static void mt76u_tx_tasklet(unsigned long data)int i;for (i =0 ; i <IEEE80211_NUM_ACS ; i++) { +u32 n_dequeued =0 , n_sw_dequeued =0 ; + sq = &dev->q_tx[i]; q = sq->q; -spin_lock_bh (&q->lock); -while (true) { -if (!q->entry[q->head].done || !q->queued) +while (q->queued > n_dequeued) { +if (!q->entry[q->head].done)break ;if (q->entry[q->head].schedule) { q->entry[q->head].schedule = false; - sq->swq_queued--; + n_sw_dequeued++; } entry = q->entry[q->head]; + q->entry[q->head].done = false; q->head = (q->head +1 ) % q->ndesc; - q->queued--; + n_dequeued++; -spin_unlock_bh (&q->lock); dev->drv->tx_complete_skb (dev, i, &entry); -spin_lock_bh (&q->lock); } +spin_lock_bh (&q->lock); + + sq->swq_queued -= n_sw_dequeued; + q->queued -= n_dequeued; + wake = q->stopped && q->queued < q->ndesc -8 ;if (wake) q->stopped = false;
@@ -741,7 +746,6 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,if (err <0 )return err; - q->entry[idx].done = false; urb = q->entry[idx].urb; err =mt76u_tx_setup_buffers (dev, skb, urb);if (err <0 )
Signature · 1 line
2.20.1
Quoted 5 lines · Lorenzo Bianconi
Similar to pci counterpart, reduce locking in
mt76u_tx_taskletsinceq->headis managed just inmt76u_tx_taskletandq->queuedis updated holdingq->lockSigned-off-by Lorenzo Bianconi <[email protected]>
Applied, thanks.
- Felix