diff options
author | Peter Zijlstra <peterz@infradead.org> | 2013-05-21 07:05:37 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2013-05-28 03:13:55 -0400 |
commit | 1b45adcd9a503428e6de6b39bc6892d86c9c1d41 (patch) | |
tree | 07bed004c5f63ca1a4097ae91c3a2bc3d11ad19c /arch | |
parent | 2b923c8f5de6722393e614b096d5040b6d4eaf98 (diff) |
perf/x86/amd: Rework AMD PMU init code
Josh reported that his QEMU is a bad hardware emulator and trips a
WARN in the AMD PMU init code. He requested the WARN be turned into a
pr_err() or similar.
While there, rework the code a little.
Reported-by: Josh Boyer <jwboyer@redhat.com>
Acked-by: Robert Richter <rric@kernel.org>
Acked-by: Jacob Shin <jacob.shin@amd.com>
Cc: Stephane Eranian <eranian@google.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20130521110537.GG26912@twins.programming.kicks-ass.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_amd.c | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index 7e28d9467bb4..4cbe03287b08 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c | |||
@@ -648,48 +648,48 @@ static __initconst const struct x86_pmu amd_pmu = { | |||
648 | .cpu_dead = amd_pmu_cpu_dead, | 648 | .cpu_dead = amd_pmu_cpu_dead, |
649 | }; | 649 | }; |
650 | 650 | ||
651 | static int setup_event_constraints(void) | 651 | static int __init amd_core_pmu_init(void) |
652 | { | 652 | { |
653 | if (boot_cpu_data.x86 == 0x15) | 653 | if (!cpu_has_perfctr_core) |
654 | return 0; | ||
655 | |||
656 | switch (boot_cpu_data.x86) { | ||
657 | case 0x15: | ||
658 | pr_cont("Fam15h "); | ||
654 | x86_pmu.get_event_constraints = amd_get_event_constraints_f15h; | 659 | x86_pmu.get_event_constraints = amd_get_event_constraints_f15h; |
655 | return 0; | 660 | break; |
656 | } | ||
657 | 661 | ||
658 | static int setup_perfctr_core(void) | 662 | default: |
659 | { | 663 | pr_err("core perfctr but no constraints; unknown hardware!\n"); |
660 | if (!cpu_has_perfctr_core) { | ||
661 | WARN(x86_pmu.get_event_constraints == amd_get_event_constraints_f15h, | ||
662 | KERN_ERR "Odd, counter constraints enabled but no core perfctrs detected!"); | ||
663 | return -ENODEV; | 664 | return -ENODEV; |
664 | } | 665 | } |
665 | 666 | ||
666 | WARN(x86_pmu.get_event_constraints == amd_get_event_constraints, | ||
667 | KERN_ERR "hw perf events core counters need constraints handler!"); | ||
668 | |||
669 | /* | 667 | /* |
670 | * If core performance counter extensions exists, we must use | 668 | * If core performance counter extensions exists, we must use |
671 | * MSR_F15H_PERF_CTL/MSR_F15H_PERF_CTR msrs. See also | 669 | * MSR_F15H_PERF_CTL/MSR_F15H_PERF_CTR msrs. See also |
672 | * x86_pmu_addr_offset(). | 670 | * amd_pmu_addr_offset(). |
673 | */ | 671 | */ |
674 | x86_pmu.eventsel = MSR_F15H_PERF_CTL; | 672 | x86_pmu.eventsel = MSR_F15H_PERF_CTL; |
675 | x86_pmu.perfctr = MSR_F15H_PERF_CTR; | 673 | x86_pmu.perfctr = MSR_F15H_PERF_CTR; |
676 | x86_pmu.num_counters = AMD64_NUM_COUNTERS_CORE; | 674 | x86_pmu.num_counters = AMD64_NUM_COUNTERS_CORE; |
677 | 675 | ||
678 | printk(KERN_INFO "perf: AMD core performance counters detected\n"); | 676 | pr_cont("core perfctr, "); |
679 | |||
680 | return 0; | 677 | return 0; |
681 | } | 678 | } |
682 | 679 | ||
683 | __init int amd_pmu_init(void) | 680 | __init int amd_pmu_init(void) |
684 | { | 681 | { |
682 | int ret; | ||
683 | |||
685 | /* Performance-monitoring supported from K7 and later: */ | 684 | /* Performance-monitoring supported from K7 and later: */ |
686 | if (boot_cpu_data.x86 < 6) | 685 | if (boot_cpu_data.x86 < 6) |
687 | return -ENODEV; | 686 | return -ENODEV; |
688 | 687 | ||
689 | x86_pmu = amd_pmu; | 688 | x86_pmu = amd_pmu; |
690 | 689 | ||
691 | setup_event_constraints(); | 690 | ret = amd_core_pmu_init(); |
692 | setup_perfctr_core(); | 691 | if (ret) |
692 | return ret; | ||
693 | 693 | ||
694 | /* Events are common for all AMDs */ | 694 | /* Events are common for all AMDs */ |
695 | memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, | 695 | memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, |