aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Rutland <Mark.Rutland@arm.com>2012-09-21 06:53:41 -0400
committerWill Deacon <will.deacon@arm.com>2012-11-09 06:37:25 -0500
commit2a4961ba89ffae388a553175db51dd58ce7c39a8 (patch)
tree284ceeaabaff2c7683eb509a8abcb0926b0d154a
parent7279adbd9bb8ef8ff669da50f0e84c65a14022b5 (diff)
ARM: perf: register cpu_notifier at driver init
The current practice of registering the cpu hotplug notifier at PMU registration time won't be safe with multiple PMUs, as we'll repeatedly attempt to register the notifier. This has the unfortunate effect of silently corrupting the notifier list, leading to boot stalling. Instead, register the notifier at init time. Its sanity checks will prevent anything bad from happening if the notifier is called before we have any PMUs registered. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--arch/arm/kernel/perf_event_cpu.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c
index 02244faa539..71c824ce020 100644
--- a/arch/arm/kernel/perf_event_cpu.c
+++ b/arch/arm/kernel/perf_event_cpu.c
@@ -285,7 +285,6 @@ static int __devinit cpu_pmu_device_probe(struct platform_device *pdev)
285 cpu_pmu = pmu; 285 cpu_pmu = pmu;
286 cpu_pmu->plat_device = pdev; 286 cpu_pmu->plat_device = pdev;
287 cpu_pmu_init(cpu_pmu); 287 cpu_pmu_init(cpu_pmu);
288 register_cpu_notifier(&cpu_pmu_hotplug_notifier);
289 armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW); 288 armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW);
290 289
291 return 0; 290 return 0;
@@ -303,6 +302,16 @@ static struct platform_driver cpu_pmu_driver = {
303 302
304static int __init register_pmu_driver(void) 303static int __init register_pmu_driver(void)
305{ 304{
306 return platform_driver_register(&cpu_pmu_driver); 305 int err;
306
307 err = register_cpu_notifier(&cpu_pmu_hotplug_notifier);
308 if (err)
309 return err;
310
311 err = platform_driver_register(&cpu_pmu_driver);
312 if (err)
313 unregister_cpu_notifier(&cpu_pmu_hotplug_notifier);
314
315 return err;
307} 316}
308device_initcall(register_pmu_driver); 317device_initcall(register_pmu_driver);