[PATCH v2 08/11] dmaengine: switchtec-dma: fix chan_status_irq cleanup on create() error

From: Logan Gunthorpe

Date: Tue Jul 21 2026 - 12:25:32 EST


chan_status_irq stores an MSI-X vector index, but err_exit freed it
with plain free_irq() instead of pci_free_irq(), which would free the
wrong Linux IRQ. The guard also treated a valid vector index of 0 as
unset, skipping the free entirely in that case and leaving the handler
registered against soon-to-be-freed swdma_dev.

Initialize chan_status_irq to -1 and use the value being non-negative
to signal when to free it with pci_free_irq().

Reported-by: Sashiko <sashiko-bot@xxxxxxxxxx>
Link: https://lore.kernel.org/dmaengine/20260717223431.625EE1F000E9@xxxxxxxxxxxxxxx
Signed-off-by: Logan Gunthorpe <logang@xxxxxxxxxxxx>
---
drivers/dma/switchtec_dma.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/dma/switchtec_dma.c b/drivers/dma/switchtec_dma.c
index a7e25cb7c0b9..4a80aad2d339 100644
--- a/drivers/dma/switchtec_dma.c
+++ b/drivers/dma/switchtec_dma.c
@@ -1257,6 +1257,8 @@ static int switchtec_dma_create(struct pci_dev *pdev)
if (!swdma_dev)
return -ENOMEM;

+ swdma_dev->chan_status_irq = -1;
+
swdma_dev->bar = ioremap(pci_resource_start(pdev, 0),
pci_resource_len(pdev, 0));

@@ -1332,8 +1334,8 @@ static int switchtec_dma_create(struct pci_dev *pdev)
switchtec_dma_chans_free(swdma_dev);

err_exit:
- if (swdma_dev->chan_status_irq)
- free_irq(swdma_dev->chan_status_irq, swdma_dev);
+ if (swdma_dev->chan_status_irq >= 0)
+ pci_free_irq(pdev, swdma_dev->chan_status_irq, swdma_dev);

iounmap(swdma_dev->bar);
kfree(swdma_dev);
--
2.47.3