Skip to content

Commit

Permalink
perf/x86/intel/cstate: Prevent hotplug callback leak
Browse files Browse the repository at this point in the history
If the pmu registration fails the registered hotplug callbacks are not
removed. Wrong in any case, but fatal in case of a modular driver.

Replace the nonsensical state names with proper ones while at it.

Fixes: 77c34ef ("perf/x86/intel/cstate: Convert Intel CSTATE to hotplug state machine")
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Sebastian Siewior <bigeasy@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: stable@vger.kernel.org
  • Loading branch information
Thomas Gleixner committed Dec 25, 2016
1 parent a051f22 commit 834fcd2
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions arch/x86/events/intel/cstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,9 @@ static int __init cstate_probe(const struct cstate_model *cm)

static inline void cstate_cleanup(void)
{
cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_ONLINE);
cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_STARTING);

if (has_cstate_core)
perf_pmu_unregister(&cstate_core_pmu);

Expand All @@ -606,16 +609,16 @@ static int __init cstate_init(void)
int err;

cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_STARTING,
"AP_PERF_X86_CSTATE_STARTING", cstate_cpu_init,
NULL);
"perf/x86/cstate:starting", cstate_cpu_init, NULL);
cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_ONLINE,
"AP_PERF_X86_CSTATE_ONLINE", NULL, cstate_cpu_exit);
"perf/x86/cstate:online", NULL, cstate_cpu_exit);

if (has_cstate_core) {
err = perf_pmu_register(&cstate_core_pmu, cstate_core_pmu.name, -1);
if (err) {
has_cstate_core = false;
pr_info("Failed to register cstate core pmu\n");
cstate_cleanup();
return err;
}
}
Expand All @@ -629,8 +632,7 @@ static int __init cstate_init(void)
return err;
}
}

return err;
return 0;
}

static int __init cstate_pmu_init(void)
Expand All @@ -655,8 +657,6 @@ module_init(cstate_pmu_init);

static void __exit cstate_pmu_exit(void)
{
cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_ONLINE);
cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_STARTING);
cstate_cleanup();
}
module_exit(cstate_pmu_exit);

0 comments on commit 834fcd2

Please sign in to comment.