on 2024/11/2 3:24, Sasha Levin wrote:
This is a note to let you know that I've just added the patch titled
net: hns3: add sync command to sync io-pgtable
to the 6.6-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git%3Ba=su...
The filename of the patch is: net-hns3-add-sync-command-to-sync-io-pgtable.patch and it can be found in the queue-6.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let stable@vger.kernel.org know about it.
Hi: This patch was reverted from netdev, so, it also need be reverted from stable tree. I am sorry for that.
reverted link: https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=24...
Thanks, Jijie Shao
commit 98cb88cce78da8a369cf780343d0280f9d3af4ca Author: Jian Shen shenjian15@huawei.com Date: Fri Oct 25 17:29:31 2024 +0800
net: hns3: add sync command to sync io-pgtable [ Upstream commit f2c14899caba76da93ff3fff46b4d5a8f43ce07e ] To avoid errors in pgtable prefectch, add a sync command to sync io-pagtable. This is a supplement for the previous patch. We want all the tx packet can be handled with tx bounce buffer path. But it depends on the remain space of the spare buffer, checked by the hns3_can_use_tx_bounce(). In most cases, maybe 99.99%, it returns true. But once it return false by no available space, the packet will be handled with the former path, which will map/unmap the skb buffer. Then the driver will face the smmu prefetch risk again. So add a sync command in this case to avoid smmu prefectch, just protects corner scenes. Fixes: 295ba232a8c3 ("net: hns3: add device version to replace pci revision") Signed-off-by: Jian Shen <shenjian15@huawei.com> Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> Signed-off-by: Jijie Shao <shaojijie@huawei.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 1f9bbf13214fb..bfcebf4e235ef 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -381,6 +381,24 @@ static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = { #define HNS3_INVALID_PTYPE \ ARRAY_SIZE(hns3_rx_ptype_tbl) +static void hns3_dma_map_sync(struct device *dev, unsigned long iova) +{
- struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
- struct iommu_iotlb_gather iotlb_gather;
- size_t granule;
- if (!domain || !iommu_is_dma_domain(domain))
return;
- granule = 1 << __ffs(domain->pgsize_bitmap);
- iova = ALIGN_DOWN(iova, granule);
- iotlb_gather.start = iova;
- iotlb_gather.end = iova + granule - 1;
- iotlb_gather.pgsize = granule;
- iommu_iotlb_sync(domain, &iotlb_gather);
+}
- static irqreturn_t hns3_irq_handle(int irq, void *vector) { struct hns3_enet_tqp_vector *tqp_vector = vector;
@@ -1728,7 +1746,9 @@ static int hns3_map_and_fill_desc(struct hns3_enet_ring *ring, void *priv, unsigned int type) { struct hns3_desc_cb *desc_cb = &ring->desc_cb[ring->next_to_use];
- struct hnae3_handle *handle = ring->tqp->handle; struct device *dev = ring_to_dev(ring);
- struct hnae3_ae_dev *ae_dev; unsigned int size; dma_addr_t dma;
@@ -1760,6 +1780,13 @@ static int hns3_map_and_fill_desc(struct hns3_enet_ring *ring, void *priv, return -ENOMEM; }
- /* Add a SYNC command to sync io-pgtale to avoid errors in pgtable
* prefetch
*/
- ae_dev = hns3_get_ae_dev(handle);
- if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V3)
hns3_dma_map_sync(dev, dma);
- desc_cb->priv = priv; desc_cb->length = size; desc_cb->dma = dma;
linux-stable-mirror@lists.linaro.org