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]>
---
 drivers/net/wireless/mediatek/mt76/usb.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/usb.c 
b/drivers/net/wireless/mediatek/mt76/usb.c
index ac03acdae279..8cd70c32d77a 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -634,29 +634,33 @@ static void mt76u_tx_tasklet(unsigned long data)
        int i;
 
        for (i = 0; i < IEEE80211_NUM_ACS; i++) {
+               u32 n_queued = 0, n_sw_queued = 0;
+
                sq = &dev->q_tx[i];
                q = sq->q;
 
-               spin_lock_bh(&q->lock);
-               while (true) {
+               while (q->queued > n_queued) {
                        buf = &q->entry[q->head].ubuf;
-                       if (!buf->done || !q->queued)
+                       if (!buf->done)
                                break;
 
                        if (q->entry[q->head].schedule) {
                                q->entry[q->head].schedule = false;
-                               sq->swq_queued--;
+                               n_sw_queued++;
                        }
 
                        entry = q->entry[q->head];
                        q->head = (q->head + 1) % q->ndesc;
-                       q->queued--;
+                       n_queued++;
 
-                       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_queued;
+               q->queued -= n_queued;
+
                wake = q->stopped && q->queued < q->ndesc - 8;
                if (wake)
                        q->stopped = false;
-- 
2.20.1

Reply via email to