Message ID | 20250309062058.58910-10-xueshuai@linux.alibaba.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | dmaengine: idxd: fix memory leak in error handling path | expand |
On 3/8/25 11:20 PM, Shuai Xue wrote: > The idxd_cleanup() helper cleans up perfmon, interrupts, internals and > so on. Refactor remove call with the idxd_cleanup() helper to avoid code > duplication. Note, this also fixes the missing put_device() for idxd > groups, enginces and wqs. > > Fixes: bfe1d56091c1 ("dmaengine: idxd: Init and probe for Intel data accelerators") > Cc: stable@vger.kernel.org > Suggested-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> > Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > drivers/dma/idxd/init.c | 14 ++------------ > 1 file changed, 2 insertions(+), 12 deletions(-) > > diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c > index ecb8d534fac4..22b411b470be 100644 > --- a/drivers/dma/idxd/init.c > +++ b/drivers/dma/idxd/init.c > @@ -1310,7 +1310,6 @@ static void idxd_shutdown(struct pci_dev *pdev) > static void idxd_remove(struct pci_dev *pdev) > { > struct idxd_device *idxd = pci_get_drvdata(pdev); > - struct idxd_irq_entry *irq_entry; > > idxd_unregister_devices(idxd); > /* > @@ -1323,21 +1322,12 @@ static void idxd_remove(struct pci_dev *pdev) > get_device(idxd_confdev(idxd)); > device_unregister(idxd_confdev(idxd)); > idxd_shutdown(pdev); > - if (device_pasid_enabled(idxd)) > - idxd_disable_system_pasid(idxd); > idxd_device_remove_debugfs(idxd); > - > - irq_entry = idxd_get_ie(idxd, 0); > - free_irq(irq_entry->vector, irq_entry); > - pci_free_irq_vectors(pdev); > + idxd_cleanup(idxd); > pci_iounmap(pdev, idxd->reg_base); > - if (device_user_pasid_enabled(idxd)) > - idxd_disable_sva(pdev); > - pci_disable_device(pdev); > - destroy_workqueue(idxd->wq); > - perfmon_pmu_remove(idxd); > put_device(idxd_confdev(idxd)); > idxd_free(idxd); > + pci_disable_device(pdev); > } > > static struct pci_driver idxd_pci_driver = {
diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c index ecb8d534fac4..22b411b470be 100644 --- a/drivers/dma/idxd/init.c +++ b/drivers/dma/idxd/init.c @@ -1310,7 +1310,6 @@ static void idxd_shutdown(struct pci_dev *pdev) static void idxd_remove(struct pci_dev *pdev) { struct idxd_device *idxd = pci_get_drvdata(pdev); - struct idxd_irq_entry *irq_entry; idxd_unregister_devices(idxd); /* @@ -1323,21 +1322,12 @@ static void idxd_remove(struct pci_dev *pdev) get_device(idxd_confdev(idxd)); device_unregister(idxd_confdev(idxd)); idxd_shutdown(pdev); - if (device_pasid_enabled(idxd)) - idxd_disable_system_pasid(idxd); idxd_device_remove_debugfs(idxd); - - irq_entry = idxd_get_ie(idxd, 0); - free_irq(irq_entry->vector, irq_entry); - pci_free_irq_vectors(pdev); + idxd_cleanup(idxd); pci_iounmap(pdev, idxd->reg_base); - if (device_user_pasid_enabled(idxd)) - idxd_disable_sva(pdev); - pci_disable_device(pdev); - destroy_workqueue(idxd->wq); - perfmon_pmu_remove(idxd); put_device(idxd_confdev(idxd)); idxd_free(idxd); + pci_disable_device(pdev); } static struct pci_driver idxd_pci_driver = {
The idxd_cleanup() helper cleans up perfmon, interrupts, internals and so on. Refactor remove call with the idxd_cleanup() helper to avoid code duplication. Note, this also fixes the missing put_device() for idxd groups, enginces and wqs. Fixes: bfe1d56091c1 ("dmaengine: idxd: Init and probe for Intel data accelerators") Cc: stable@vger.kernel.org Suggested-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> Signed-off-by: Shuai Xue <xueshuai@linux.alibaba.com> --- drivers/dma/idxd/init.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)