2020-01-14 20:27:16

by Leonard Crestez

[permalink] [raw]
Subject: [PATCH v2] perf/imx_ddr: Fix cpu hotplug state cleanup

This driver allocates a dynamic cpu hotplug state but never releases it.
If reloaded in a loop it will quickly trigger a WARN message:

"No more dynamic states available for CPU hotplug"

Fix by calling cpuhp_remove_multi_state on remove like several other
perf pmu drivers.

Also fix the cleanup logic on probe error paths: add the missing
cpuhp_remove_multi_state call and properly check the return value from
cpuhp_state_add_instant_nocalls.

Fixes: 9a66d36cc7ac ("drivers/perf: imx_ddr: Add DDR performance counter support to perf")
Signed-off-by: Leonard Crestez <[email protected]>

---

Changes since v1:
* Handle cpuhp_state_add_instant_nocalls error with additional error
labels.
Link to v1: https://patchwork.kernel.org/patch/11302423/
---
drivers/perf/fsl_imx8_ddr_perf.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c
index 3be61be1ba91..f144f1fd9b4d 100644
--- a/drivers/perf/fsl_imx8_ddr_perf.c
+++ b/drivers/perf/fsl_imx8_ddr_perf.c
@@ -631,17 +631,21 @@ static int ddr_perf_probe(struct platform_device *pdev)
NULL,
ddr_perf_offline_cpu);

if (ret < 0) {
dev_err(&pdev->dev, "cpuhp_setup_state_multi failed\n");
- goto ddr_perf_err;
+ goto cpuhp_state_err;
}

pmu->cpuhp_state = ret;

/* Register the pmu instance for cpu hotplug */
- cpuhp_state_add_instance_nocalls(pmu->cpuhp_state, &pmu->node);
+ ret = cpuhp_state_add_instance_nocalls(pmu->cpuhp_state, &pmu->node);
+ if (ret) {
+ dev_err(&pdev->dev, "Error %d registering hotplug\n", ret);
+ goto cpuhp_instance_err;
+ }

/* Request irq */
irq = of_irq_get(np, 0);
if (irq < 0) {
dev_err(&pdev->dev, "Failed to get irq: %d", irq);
@@ -672,23 +676,25 @@ static int ddr_perf_probe(struct platform_device *pdev)
goto ddr_perf_err;

return 0;

ddr_perf_err:
- if (pmu->cpuhp_state)
- cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node);
-
+ cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node);
+cpuhp_instance_err:
+ cpuhp_remove_multi_state(pmu->cpuhp_state);
+cpuhp_state_err:
ida_simple_remove(&ddr_ida, pmu->id);
dev_warn(&pdev->dev, "i.MX8 DDR Perf PMU failed (%d), disabled\n", ret);
return ret;
}

static int ddr_perf_remove(struct platform_device *pdev)
{
struct ddr_pmu *pmu = platform_get_drvdata(pdev);

cpuhp_state_remove_instance_nocalls(pmu->cpuhp_state, &pmu->node);
+ cpuhp_remove_multi_state(pmu->cpuhp_state);
irq_set_affinity_hint(pmu->irq, NULL);

perf_pmu_unregister(&pmu->pmu);

ida_simple_remove(&ddr_ida, pmu->id);
--
2.17.1


2020-01-15 01:37:49

by Joakim Zhang

[permalink] [raw]
Subject: RE: [PATCH v2] perf/imx_ddr: Fix cpu hotplug state cleanup


> -----Original Message-----
> From: Leonard Crestez <[email protected]>
> Sent: 2020??1??15?? 4:26
> To: Joakim Zhang <[email protected]>; Will Deacon <[email protected]>
> Cc: Frank Li <[email protected]>; Mark Rutland <[email protected]>;
> Peter Zijlstra <[email protected]>; Ingo Molnar <[email protected]>;
> Arnaldo Carvalho de Melo <[email protected]>; Alexander Shishkin
> <[email protected]>; Jiri Olsa <[email protected]>;
> Namhyung Kim <[email protected]>; [email protected]
> Subject: [PATCH v2] perf/imx_ddr: Fix cpu hotplug state cleanup
>
> This driver allocates a dynamic cpu hotplug state but never releases it.
> If reloaded in a loop it will quickly trigger a WARN message:
>
> "No more dynamic states available for CPU hotplug"
>
> Fix by calling cpuhp_remove_multi_state on remove like several other perf pmu
> drivers.
>
> Also fix the cleanup logic on probe error paths: add the missing
> cpuhp_remove_multi_state call and properly check the return value from
> cpuhp_state_add_instant_nocalls.
>
> Fixes: 9a66d36cc7ac ("drivers/perf: imx_ddr: Add DDR performance counter
> support to perf")
> Signed-off-by: Leonard Crestez <[email protected]>
Acked-by: Joakim Zhang <[email protected]>

Best Regards,
Joakim Zhang

2020-01-15 12:51:07

by Will Deacon

[permalink] [raw]
Subject: Re: [PATCH v2] perf/imx_ddr: Fix cpu hotplug state cleanup

On Tue, Jan 14, 2020 at 10:25:46PM +0200, Leonard Crestez wrote:
> This driver allocates a dynamic cpu hotplug state but never releases it.
> If reloaded in a loop it will quickly trigger a WARN message:
>
> "No more dynamic states available for CPU hotplug"
>
> Fix by calling cpuhp_remove_multi_state on remove like several other
> perf pmu drivers.
>
> Also fix the cleanup logic on probe error paths: add the missing
> cpuhp_remove_multi_state call and properly check the return value from
> cpuhp_state_add_instant_nocalls.
>
> Fixes: 9a66d36cc7ac ("drivers/perf: imx_ddr: Add DDR performance counter support to perf")
> Signed-off-by: Leonard Crestez <[email protected]>
>
> ---
>
> Changes since v1:
> * Handle cpuhp_state_add_instant_nocalls error with additional error
> labels.
> Link to v1: https://patchwork.kernel.org/patch/11302423/
> ---
> drivers/perf/fsl_imx8_ddr_perf.c | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)

Thanks, I've queued this up with Joakim's ack.

Will