| From 834fcd298003c10ce450e66960c78893cb1cc4b5 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Thu, 22 Dec 2016 11:02:08 +0100 |
| Subject: perf/x86/intel/cstate: Prevent hotplug callback leak |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit 834fcd298003c10ce450e66960c78893cb1cc4b5 upstream. |
| |
| 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: 77c34ef1c319 ("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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/events/intel/cstate.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| --- a/arch/x86/events/intel/cstate.c |
| +++ b/arch/x86/events/intel/cstate.c |
| @@ -571,6 +571,9 @@ static int __init cstate_probe(const str |
| |
| 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); |
| |
| @@ -583,16 +586,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; |
| } |
| } |
| @@ -606,8 +609,7 @@ static int __init cstate_init(void) |
| return err; |
| } |
| } |
| - |
| - return err; |
| + return 0; |
| } |
| |
| static int __init cstate_pmu_init(void) |
| @@ -632,8 +634,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); |