wifi: mt76: dma: free rx_head in mt76_dma_rx_cleanup
authorLorenzo Bianconi <lorenzo@kernel.org>
Sun, 1 Jan 2023 11:47:57 +0000 (12:47 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:33:51 +0000 (09:33 +0100)
[ Upstream commit 1b88b47e898edef0e56e3a2f4e49f052a136153d ]

Free rx_head skb in mt76_dma_rx_cleanup routine in order to avoid
possible memory leak at module unload.

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

index 7378c4d..478bffb 100644 (file)
@@ -573,6 +573,7 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
                return;
 
        spin_lock_bh(&q->lock);
+
        do {
                buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more);
                if (!buf)
@@ -580,6 +581,12 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
 
                skb_free_frag(buf);
        } while (1);
+
+       if (q->rx_head) {
+               dev_kfree_skb(q->rx_head);
+               q->rx_head = NULL;
+       }
+
        spin_unlock_bh(&q->lock);
 
        if (!q->rx_page.va)
@@ -605,12 +612,6 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)
        mt76_dma_rx_cleanup(dev, q);
        mt76_dma_sync_idx(dev, q);
        mt76_dma_rx_fill(dev, q);
-
-       if (!q->rx_head)
-               return;
-
-       dev_kfree_skb(q->rx_head);
-       q->rx_head = NULL;
 }
 
 static void