projects
/
platform
/
kernel
/
linux-riscv.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
fb6e3d4
)
dmaengine: ioatdma: Fix kmemleak in ioat_pci_probe()
author
Nikita Shubin
<n.shubin@yadro.com>
Tue, 28 May 2024 06:09:25 +0000
(09:09 +0300)
committer
Greg Kroah-Hartman
<gregkh@linuxfoundation.org>
Thu, 27 Jun 2024 11:49:09 +0000
(13:49 +0200)
[ Upstream commit
29b7cd255f3628e0d65be33a939d8b5bba10aa62
]
If probing fails we end up with leaking ioatdma_device and each
allocated channel.
Following kmemleak easy to reproduce by injecting an error in
ioat_alloc_chan_resources() when doing ioat_dma_self_test().
unreferenced object 0xffff888014ad5800 (size 1024): [..]
[<
ffffffff827692ca
>] kmemleak_alloc+0x4a/0x80
[<
ffffffff81430600
>] kmalloc_trace+0x270/0x2f0
[<
ffffffffa000b7d1
>] ioat_pci_probe+0xc1/0x1c0 [ioatdma]
[..]
repeated for each ioatdma channel:
unreferenced object 0xffff8880148e5c00 (size 512): [..]
[<
ffffffff827692ca
>] kmemleak_alloc+0x4a/0x80
[<
ffffffff81430600
>] kmalloc_trace+0x270/0x2f0
[<
ffffffffa0009641
>] ioat_enumerate_channels+0x101/0x2d0 [ioatdma]
[<
ffffffffa000b266
>] ioat3_dma_probe+0x4d6/0x970 [ioatdma]
[<
ffffffffa000b891
>] ioat_pci_probe+0x181/0x1c0 [ioatdma]
[..]
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-3-a9f2fbe26ab1@yadro.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/dma/ioat/init.c
patch
|
blob
|
history
diff --git
a/drivers/dma/ioat/init.c
b/drivers/dma/ioat/init.c
index 26964b7c8cf141073a74b2555fa7abed8839d9ae..cf688b0c8444cb62f42088a99d4425b7f5fe68fc 100644
(file)
--- a/
drivers/dma/ioat/init.c
+++ b/
drivers/dma/ioat/init.c
@@
-1347,6
+1347,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;
+ unsigned int i;
u8 version;
int err;
@@
-1384,6
+1385,9
@@
static int ioat_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
err = ioat3_dma_probe(device, ioat_dca_enabled);
if (err) {
+ for (i = 0; i < IOAT_MAX_CHANS; i++)
+ kfree(device->idx[i]);
+ kfree(device);
dev_err(dev, "Intel(R) I/OAT DMA Engine init failed\n");
return -ENODEV;
}