diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-12-22 05:02:08 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-01-09 02:32:16 -0500 |
commit | 19d55b9f32b6888411c6d09090537dd1ddbf8025 (patch) | |
tree | 448ccce921d1068f9e70bdd429ec916fdde0e2fc | |
parent | ba12b35fbd69020d1fad79f0cead0fbd9ea4822a (diff) |
perf/x86/intel/cstate: Prevent hotplug callback leak
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>
-rw-r--r-- | arch/x86/events/intel/cstate.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/arch/x86/events/intel/cstate.c b/arch/x86/events/intel/cstate.c index da51e5a3e2ff..fec8a461bdef 100644 --- a/arch/x86/events/intel/cstate.c +++ b/arch/x86/events/intel/cstate.c | |||
@@ -594,6 +594,9 @@ static int __init cstate_probe(const struct cstate_model *cm) | |||
594 | 594 | ||
595 | static inline void cstate_cleanup(void) | 595 | static inline void cstate_cleanup(void) |
596 | { | 596 | { |
597 | cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_ONLINE); | ||
598 | cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_STARTING); | ||
599 | |||
597 | if (has_cstate_core) | 600 | if (has_cstate_core) |
598 | perf_pmu_unregister(&cstate_core_pmu); | 601 | perf_pmu_unregister(&cstate_core_pmu); |
599 | 602 | ||
@@ -606,16 +609,16 @@ static int __init cstate_init(void) | |||
606 | int err; | 609 | int err; |
607 | 610 | ||
608 | cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_STARTING, | 611 | cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_STARTING, |
609 | "AP_PERF_X86_CSTATE_STARTING", cstate_cpu_init, | 612 | "perf/x86/cstate:starting", cstate_cpu_init, NULL); |
610 | NULL); | ||
611 | cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_ONLINE, | 613 | cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_ONLINE, |
612 | "AP_PERF_X86_CSTATE_ONLINE", NULL, cstate_cpu_exit); | 614 | "perf/x86/cstate:online", NULL, cstate_cpu_exit); |
613 | 615 | ||
614 | if (has_cstate_core) { | 616 | if (has_cstate_core) { |
615 | err = perf_pmu_register(&cstate_core_pmu, cstate_core_pmu.name, -1); | 617 | err = perf_pmu_register(&cstate_core_pmu, cstate_core_pmu.name, -1); |
616 | if (err) { | 618 | if (err) { |
617 | has_cstate_core = false; | 619 | has_cstate_core = false; |
618 | pr_info("Failed to register cstate core pmu\n"); | 620 | pr_info("Failed to register cstate core pmu\n"); |
621 | cstate_cleanup(); | ||
619 | return err; | 622 | return err; |
620 | } | 623 | } |
621 | } | 624 | } |
@@ -629,8 +632,7 @@ static int __init cstate_init(void) | |||
629 | return err; | 632 | return err; |
630 | } | 633 | } |
631 | } | 634 | } |
632 | 635 | return 0; | |
633 | return err; | ||
634 | } | 636 | } |
635 | 637 | ||
636 | static int __init cstate_pmu_init(void) | 638 | static int __init cstate_pmu_init(void) |
@@ -655,8 +657,6 @@ module_init(cstate_pmu_init); | |||
655 | 657 | ||
656 | static void __exit cstate_pmu_exit(void) | 658 | static void __exit cstate_pmu_exit(void) |
657 | { | 659 | { |
658 | cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_ONLINE); | ||
659 | cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_STARTING); | ||
660 | cstate_cleanup(); | 660 | cstate_cleanup(); |
661 | } | 661 | } |
662 | module_exit(cstate_pmu_exit); | 662 | module_exit(cstate_pmu_exit); |