Commit 1b11b4ef authored by Nikita Shubin's avatar Nikita Shubin Committed by Vinod Koul
Browse files

dmaengine: ioatdma: Fix leaking on version mismatch



Fix leaking ioatdma_device if I/OAT version is less than IOAT_VER_3_0.

Fixes: bf453a0a ("dmaengine: ioat: Support in-use unbind")
Signed-off-by: default avatarNikita Shubin <n.shubin@yadro.com>
Reviewed-by: default avatarDave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/20240528-ioatdma-fixes-v2-1-a9f2fbe26ab1@yadro.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent ba27e9d2
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -1350,6 +1350,7 @@ static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	void __iomem * const *iomap;
	struct device *dev = &pdev->dev;
	struct ioatdma_device *device;
	u8 version;
	int err;

	err = pcim_enable_device(pdev);
@@ -1363,6 +1364,10 @@ static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	if (!iomap)
		return -ENOMEM;

	version = readb(iomap[IOAT_MMIO_BAR] + IOAT_VER_OFFSET);
	if (version < IOAT_VER_3_0)
		return -ENODEV;

	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
	if (err)
		return err;
@@ -1373,16 +1378,14 @@ static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	pci_set_master(pdev);
	pci_set_drvdata(pdev, device);

	device->version = readb(device->reg_base + IOAT_VER_OFFSET);
	device->version = version;
	if (device->version >= IOAT_VER_3_4)
		ioat_dca_enabled = 0;
	if (device->version >= IOAT_VER_3_0) {

	if (is_skx_ioat(pdev))
		device->version = IOAT_VER_3_2;
		err = ioat3_dma_probe(device, ioat_dca_enabled);
	} else
		return -ENODEV;

	err = ioat3_dma_probe(device, ioat_dca_enabled);
	if (err) {
		dev_err(dev, "Intel(R) I/OAT DMA Engine init failed\n");
		return -ENODEV;