perf/imx_ddr: Move ida_alloc() from ddr_perf_init() to ddr_perf_probe()

Move ida_alloc() from helper ddr_perf_init() into ddr_perf_probe() to
clarify why ida_free() must be called at the error path.

Add return value check for ida_alloc().

Rename label 'cpuhp_state_err' to 'idr_free' to make the code clearer,
since two error paths now jump to this label.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Frank Li 2025-11-03 16:48:29 -05:00 committed by Will Deacon
parent de8209e554
commit 66db99ffdf
1 changed files with 12 additions and 9 deletions

View File

@ -645,7 +645,7 @@ static void ddr_perf_pmu_disable(struct pmu *pmu)
{ {
} }
static int ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base, static void ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base,
struct device *dev) struct device *dev)
{ {
*pmu = (struct ddr_pmu) { *pmu = (struct ddr_pmu) {
@ -667,9 +667,6 @@ static int ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base,
.base = base, .base = base,
.dev = dev, .dev = dev,
}; };
pmu->id = ida_alloc(&ddr_ida, GFP_KERNEL);
return pmu->id;
} }
static irqreturn_t ddr_perf_irq_handler(int irq, void *p) static irqreturn_t ddr_perf_irq_handler(int irq, void *p)
@ -753,15 +750,21 @@ static int ddr_perf_probe(struct platform_device *pdev)
if (!pmu) if (!pmu)
return -ENOMEM; return -ENOMEM;
num = ddr_perf_init(pmu, base, &pdev->dev); ddr_perf_init(pmu, base, &pdev->dev);
platform_set_drvdata(pdev, pmu); platform_set_drvdata(pdev, pmu);
num = ida_alloc(&ddr_ida, GFP_KERNEL);
if (num < 0)
return num;
pmu->id = num;
name = devm_kasprintf(&pdev->dev, GFP_KERNEL, DDR_PERF_DEV_NAME "%d", name = devm_kasprintf(&pdev->dev, GFP_KERNEL, DDR_PERF_DEV_NAME "%d",
num); num);
if (!name) { if (!name) {
ret = -ENOMEM; ret = -ENOMEM;
goto cpuhp_state_err; goto idr_free;
} }
pmu->devtype_data = of_device_get_match_data(&pdev->dev); pmu->devtype_data = of_device_get_match_data(&pdev->dev);
@ -774,7 +777,7 @@ static int ddr_perf_probe(struct platform_device *pdev)
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "cpuhp_setup_state_multi failed\n"); dev_err(&pdev->dev, "cpuhp_setup_state_multi failed\n");
goto cpuhp_state_err; goto idr_free;
} }
pmu->cpuhp_state = ret; pmu->cpuhp_state = ret;
@ -821,7 +824,7 @@ static int ddr_perf_probe(struct platform_device *pdev)
cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node); cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node);
cpuhp_instance_err: cpuhp_instance_err:
cpuhp_remove_multi_state(pmu->cpuhp_state); cpuhp_remove_multi_state(pmu->cpuhp_state);
cpuhp_state_err: idr_free:
ida_free(&ddr_ida, pmu->id); ida_free(&ddr_ida, pmu->id);
dev_warn(&pdev->dev, "i.MX8 DDR Perf PMU failed (%d), disabled\n", ret); dev_warn(&pdev->dev, "i.MX8 DDR Perf PMU failed (%d), disabled\n", ret);
return ret; return ret;