All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb
@ 2021-02-16 13:51 Felix Fietkau
  2021-02-16 13:51 ` [PATCH 5.12 2/2] mt76: mt7915: only modify tx buffer list after allocating tx token id Felix Fietkau
  2021-02-18  6:09 ` [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb Kalle Valo
  0 siblings, 2 replies; 3+ messages in thread
From: Felix Fietkau @ 2021-02-16 13:51 UTC (permalink / raw)
  To: linux-wireless; +Cc: kvalo

When running out of room in the tx queue after calling drv->tx_prepare_skb,
the buffer list will already have been modified on MT7615 and newer drivers.
This can leak a DMA mapping and will show up as swiotlb allocation failures
on x86.

Fix this by moving the queue length check further up. This is less accurate,
since it can overestimate the needed room in the queue on MT7615 and newer,
but the difference is small enough to not matter in practice.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
 drivers/net/wireless/mediatek/mt76/dma.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c
index 19098b852d0a..abdc8d364361 100644
--- a/drivers/net/wireless/mediatek/mt76/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/dma.c
@@ -345,7 +345,6 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
 	};
 	struct ieee80211_hw *hw;
 	int len, n = 0, ret = -ENOMEM;
-	struct mt76_queue_entry e;
 	struct mt76_txwi_cache *t;
 	struct sk_buff *iter;
 	dma_addr_t addr;
@@ -387,6 +386,11 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
 	}
 	tx_info.nbuf = n;
 
+	if (q->queued + (tx_info.nbuf + 1) / 2 >= q->ndesc - 1) {
+		ret = -ENOMEM;
+		goto unmap;
+	}
+
 	dma_sync_single_for_cpu(dev->dev, t->dma_addr, dev->drv->txwi_size,
 				DMA_TO_DEVICE);
 	ret = dev->drv->tx_prepare_skb(dev, txwi, q->qid, wcid, sta, &tx_info);
@@ -395,11 +399,6 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
 	if (ret < 0)
 		goto unmap;
 
-	if (q->queued + (tx_info.nbuf + 1) / 2 >= q->ndesc - 1) {
-		ret = -ENOMEM;
-		goto unmap;
-	}
-
 	return mt76_dma_add_buf(dev, q, tx_info.buf, tx_info.nbuf,
 				tx_info.info, tx_info.skb, t);
 
@@ -419,9 +418,7 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
 	}
 #endif
 
-	e.skb = tx_info.skb;
-	e.txwi = t;
-	dev->drv->tx_complete_skb(dev, &e);
+	dev_kfree_skb(tx_info.skb);
 	mt76_put_txwi(dev, t);
 	return ret;
 }
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 5.12 2/2] mt76: mt7915: only modify tx buffer list after allocating tx token id
  2021-02-16 13:51 [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb Felix Fietkau
@ 2021-02-16 13:51 ` Felix Fietkau
  2021-02-18  6:09 ` [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb Kalle Valo
  1 sibling, 0 replies; 3+ messages in thread
From: Felix Fietkau @ 2021-02-16 13:51 UTC (permalink / raw)
  To: linux-wireless; +Cc: kvalo

Modifying the tx buffer list too early can leak DMA mappings

Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index eb889f8d6fea..e5a258958ac9 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -967,11 +967,6 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
 	}
 	txp->nbuf = nbuf;
 
-	/* pass partial skb header to fw */
-	tx_info->buf[1].len = MT_CT_PARSE_LEN;
-	tx_info->buf[1].skip_unmap = true;
-	tx_info->nbuf = MT_CT_DMA_BUF_NUM;
-
 	txp->flags = cpu_to_le16(MT_CT_INFO_APPLY_TXD | MT_CT_INFO_FROM_HOST);
 
 	if (!key)
@@ -1009,6 +1004,11 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
 		txp->rept_wds_wcid = cpu_to_le16(0x3ff);
 	tx_info->skb = DMA_DUMMY_DATA;
 
+	/* pass partial skb header to fw */
+	tx_info->buf[1].len = MT_CT_PARSE_LEN;
+	tx_info->buf[1].skip_unmap = true;
+	tx_info->nbuf = MT_CT_DMA_BUF_NUM;
+
 	return 0;
 }
 
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb
  2021-02-16 13:51 [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb Felix Fietkau
  2021-02-16 13:51 ` [PATCH 5.12 2/2] mt76: mt7915: only modify tx buffer list after allocating tx token id Felix Fietkau
@ 2021-02-18  6:09 ` Kalle Valo
  1 sibling, 0 replies; 3+ messages in thread
From: Kalle Valo @ 2021-02-18  6:09 UTC (permalink / raw)
  To: Felix Fietkau; +Cc: linux-wireless

Felix Fietkau <nbd@nbd.name> wrote:

> When running out of room in the tx queue after calling drv->tx_prepare_skb,
> the buffer list will already have been modified on MT7615 and newer drivers.
> This can leak a DMA mapping and will show up as swiotlb allocation failures
> on x86.
> 
> Fix this by moving the queue length check further up. This is less accurate,
> since it can overestimate the needed room in the queue on MT7615 and newer,
> but the difference is small enough to not matter in practice.
> 
> Signed-off-by: Felix Fietkau <nbd@nbd.name>

2 patches applied to wireless-drivers.git, thanks.

ae064fc0e32a mt76: fix tx skb error handling in mt76_dma_tx_queue_skb
94f0e6256c2a mt76: mt7915: only modify tx buffer list after allocating tx token id

-- 
https://patchwork.kernel.org/project/linux-wireless/patch/20210216135119.23809-1-nbd@nbd.name/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-02-18  6:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-16 13:51 [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb Felix Fietkau
2021-02-16 13:51 ` [PATCH 5.12 2/2] mt76: mt7915: only modify tx buffer list after allocating tx token id Felix Fietkau
2021-02-18  6:09 ` [PATCH 5.12 1/2] mt76: fix tx skb error handling in mt76_dma_tx_queue_skb Kalle Valo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.