]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mt76: usb: reduce locking in mt76u_tx_tasklet
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 25 Mar 2019 19:18:38 +0000 (20:18 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 1 May 2019 11:03:58 +0000 (13:03 +0200)
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>
drivers/net/wireless/mediatek/mt76/usb.c

index 15aeda0582e77d40557059b6eabd5e5a4c3750e3..fb8b22c1655a66a9abde26712c06bbaec6ca4532 100644 (file)
@@ -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)