Skip to content

Commit b7cb9a0

Browse files
ysunvinodkoul
authored andcommitted
dmaengine: idxd: Fix refcount underflow on module unload
A recent refactor introduced a misplaced put_device() call, resulting in a reference count underflow during module unload. There is no need to add additional put_device() calls for idxd groups, engines, or workqueues. Although the commit claims: "Note, this also fixes the missing put_device() for idxd groups, engines, and wqs." It appears no such omission actually existed. The required cleanup is already handled by the call chain: idxd_unregister_devices() -> device_unregister() -> put_device() Extend idxd_cleanup() to handle the remaining necessary cleanup and remove idxd_cleanup_internals(), which duplicates deallocation logic for idxd, engines, groups, and workqueues. Memory management is also properly handled through the Linux device model. Fixes: a409e91 ("dmaengine: idxd: Refactor remove call with idxd_cleanup() helper") Signed-off-by: Yi Sun <[email protected]> Tested-by: Shuai Xue <[email protected]> Reviewed-by: Dave Jiang <[email protected]> Acked-by: Vinicius Costa Gomes <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent f41c538 commit b7cb9a0

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/dma/idxd/init.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1291,7 +1291,10 @@ static void idxd_remove(struct pci_dev *pdev)
12911291
device_unregister(idxd_confdev(idxd));
12921292
idxd_shutdown(pdev);
12931293
idxd_device_remove_debugfs(idxd);
1294-
idxd_cleanup(idxd);
1294+
perfmon_pmu_remove(idxd);
1295+
idxd_cleanup_interrupts(idxd);
1296+
if (device_pasid_enabled(idxd))
1297+
idxd_disable_system_pasid(idxd);
12951298
pci_iounmap(pdev, idxd->reg_base);
12961299
put_device(idxd_confdev(idxd));
12971300
pci_disable_device(pdev);

0 commit comments

Comments
 (0)