Commit 3302f7f9 authored by Jian Shen's avatar Jian Shen Committed by Hao Chen
Browse files

net: hns3: add sync command to sync io-pgtable

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAN3KC


CVE: NA

----------------------------------------------------------------------

To avoid errors in pgtable prefectch, add a sync command to sync
io-pagtable.

Fixes: 3dd7206f ("net: hns3: use tx bounce buffer for small packets")
Signed-off-by: default avatarJian Shen <shenjian15@huawei.com>
Signed-off-by: default avatarPeiyang Wang <wangpeiyang1@huawei.com>
parent 6c09876c
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -403,6 +403,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 || domain->type != IOMMU_DOMAIN_DMA)
		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;
@@ -1971,7 +1989,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;

@@ -2003,6 +2023,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;