wifi: mt76: sdio: move mcu queue size check inside critical section
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 25 Mar 2024 16:07:16 +0000 (17:07 +0100)
committerFelix Fietkau <nbd@nbd.name>
Thu, 2 May 2024 10:44:51 +0000 (12:44 +0200)
Even if it is not a real issue at the moment since concurrent access to
mcu message queue is protected by mcu mutex, make the code more robust
and move mcu queue free space check inside queue spinlock critical section.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/sdio.c

index 1ca5438b695835cd4cd0f83d50edaea17ac8b915..8e9576747052d6ce62644ecedf5eadf58921a6e1 100644 (file)
@@ -550,10 +550,7 @@ static int
 mt76s_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,
                       struct sk_buff *skb, u32 tx_info)
 {
-       int ret = -ENOSPC, len = skb->len, pad;
-
-       if (q->queued == q->ndesc)
-               goto error;
+       int ret, len = skb->len, pad;
 
        pad = round_up(skb->len, 4) - skb->len;
        ret = mt76_skb_adjust_pad(skb, pad);
@@ -562,6 +559,12 @@ mt76s_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,
 
        spin_lock_bh(&q->lock);
 
+       if (q->queued == q->ndesc) {
+               ret = -ENOSPC;
+               spin_unlock_bh(&q->lock);
+               goto error;
+       }
+
        q->entry[q->head].buf_sz = len;
        q->entry[q->head].skb = skb;