dmaengine: ioatdma: Fix leaking on version mismatch
authorNikita Shubin <n.shubin@yadro.com>
Tue, 28 May 2024 06:09:23 +0000 (09:09 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jun 2024 11:49:09 +0000 (13:49 +0200)
[ Upstream commit 1b11b4ef6bd68591dcaf8423c7d05e794e6aec6f ]

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

Fixes: bf453a0a18b2 ("dmaengine: ioat: Support in-use unbind")
Signed-off-by: Nikita Shubin <n.shubin@yadro.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/20240528-ioatdma-fixes-v2-1-a9f2fbe26ab1@yadro.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/dma/ioat/init.c

index 9c364e92cb828da1833a6ec024196e448981ab79..e76e507ae898caf360ffb9439a0c4e76f1667e8b 100644 (file)
@@ -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;
 
+       if (is_skx_ioat(pdev))
+               device->version = IOAT_VER_3_2;
+
+       err = ioat3_dma_probe(device, ioat_dca_enabled);
        if (err) {
                dev_err(dev, "Intel(R) I/OAT DMA Engine init failed\n");
                return -ENODEV;