summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/mediatek/mt76/usb.c
diff options
context:
space:
mode:
authorLorenzo Bianconi <lorenzo@kernel.org>2019-03-25 22:18:38 +0300
committerFelix Fietkau <nbd@nbd.name>2019-05-01 14:03:58 +0300
commitce0fd825890856b1681e41bba639b5f3c39569e3 (patch)
treebdfc1d5f595cfae993218a5f9bef0e6934bf2d8c /drivers/net/wireless/mediatek/mt76/usb.c
parent37426fb67a017f0140e529fe4b09e490989cdbf0 (diff)
downloadlinux-ce0fd825890856b1681e41bba639b5f3c39569e3.tar.xz
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 <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/usb.c')
-rw-r--r--drivers/net/wireless/mediatek/mt76/usb.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index 15aeda0582e7..fb8b22c1655a 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -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)