perf/dwc_pcie: fix some unreleased resources
[ Upstream commit 6eb1e8ef586ac4a3dcdc20248f9cb45e4ceb141f ] Release leaked resources, such as plat_dev and dev_info. Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com> Reviewed-by: Shuai Xue <xueshuai@linux.alibaba.com> Link: https://lore.kernel.org/r/20250220121716.50324-2-cuiyunhui@bytedance.com Signed-off-by: Will Deacon <will@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1b3ebfb15d
commit
89a4db7a67
+22
-11
@@ -567,8 +567,10 @@ static int dwc_pcie_register_dev(struct pci_dev *pdev)
|
|||||||
return PTR_ERR(plat_dev);
|
return PTR_ERR(plat_dev);
|
||||||
|
|
||||||
dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL);
|
dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL);
|
||||||
if (!dev_info)
|
if (!dev_info) {
|
||||||
|
platform_device_unregister(plat_dev);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* Cache platform device to handle pci device hotplug */
|
/* Cache platform device to handle pci device hotplug */
|
||||||
dev_info->plat_dev = plat_dev;
|
dev_info->plat_dev = plat_dev;
|
||||||
@@ -724,6 +726,15 @@ static struct platform_driver dwc_pcie_pmu_driver = {
|
|||||||
.driver = {.name = "dwc_pcie_pmu",},
|
.driver = {.name = "dwc_pcie_pmu",},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void dwc_pcie_cleanup_devices(void)
|
||||||
|
{
|
||||||
|
struct dwc_pcie_dev_info *dev_info, *tmp;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(dev_info, tmp, &dwc_pcie_dev_info_head, dev_node) {
|
||||||
|
dwc_pcie_unregister_dev(dev_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int __init dwc_pcie_pmu_init(void)
|
static int __init dwc_pcie_pmu_init(void)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = NULL;
|
struct pci_dev *pdev = NULL;
|
||||||
@@ -736,7 +747,7 @@ static int __init dwc_pcie_pmu_init(void)
|
|||||||
ret = dwc_pcie_register_dev(pdev);
|
ret = dwc_pcie_register_dev(pdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pci_dev_put(pdev);
|
pci_dev_put(pdev);
|
||||||
return ret;
|
goto err_cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -745,35 +756,35 @@ static int __init dwc_pcie_pmu_init(void)
|
|||||||
dwc_pcie_pmu_online_cpu,
|
dwc_pcie_pmu_online_cpu,
|
||||||
dwc_pcie_pmu_offline_cpu);
|
dwc_pcie_pmu_offline_cpu);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
goto err_cleanup;
|
||||||
|
|
||||||
dwc_pcie_pmu_hp_state = ret;
|
dwc_pcie_pmu_hp_state = ret;
|
||||||
|
|
||||||
ret = platform_driver_register(&dwc_pcie_pmu_driver);
|
ret = platform_driver_register(&dwc_pcie_pmu_driver);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto platform_driver_register_err;
|
goto err_remove_cpuhp;
|
||||||
|
|
||||||
ret = bus_register_notifier(&pci_bus_type, &dwc_pcie_pmu_nb);
|
ret = bus_register_notifier(&pci_bus_type, &dwc_pcie_pmu_nb);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto platform_driver_register_err;
|
goto err_unregister_driver;
|
||||||
notify = true;
|
notify = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
platform_driver_register_err:
|
err_unregister_driver:
|
||||||
|
platform_driver_unregister(&dwc_pcie_pmu_driver);
|
||||||
|
err_remove_cpuhp:
|
||||||
cpuhp_remove_multi_state(dwc_pcie_pmu_hp_state);
|
cpuhp_remove_multi_state(dwc_pcie_pmu_hp_state);
|
||||||
|
err_cleanup:
|
||||||
|
dwc_pcie_cleanup_devices();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit dwc_pcie_pmu_exit(void)
|
static void __exit dwc_pcie_pmu_exit(void)
|
||||||
{
|
{
|
||||||
struct dwc_pcie_dev_info *dev_info, *tmp;
|
|
||||||
|
|
||||||
if (notify)
|
if (notify)
|
||||||
bus_unregister_notifier(&pci_bus_type, &dwc_pcie_pmu_nb);
|
bus_unregister_notifier(&pci_bus_type, &dwc_pcie_pmu_nb);
|
||||||
list_for_each_entry_safe(dev_info, tmp, &dwc_pcie_dev_info_head, dev_node)
|
dwc_pcie_cleanup_devices();
|
||||||
dwc_pcie_unregister_dev(dev_info);
|
|
||||||
platform_driver_unregister(&dwc_pcie_pmu_driver);
|
platform_driver_unregister(&dwc_pcie_pmu_driver);
|
||||||
cpuhp_remove_multi_state(dwc_pcie_pmu_hp_state);
|
cpuhp_remove_multi_state(dwc_pcie_pmu_hp_state);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user