Messages in this thread Patch in this message | | | From | kan.liang@linux ... | Subject | [PATCH 13/49] perf/x86: Expose check_hw_exists | Date | Mon, 8 Feb 2021 07:25:10 -0800 |
| |
From: Kan Liang <kan.liang@linux.intel.com>
Hybrid PMUs have a different number of counters. Each Hybrid PMU has to check its own HW existence before registration.
Expose check_hw_exists, and add number of counters as parameters.
Reviewed-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Kan Liang <kan.liang@linux.intel.com> --- arch/x86/events/core.c | 10 +++++----- arch/x86/events/perf_event.h | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index 6857934..29dee3f 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c @@ -239,7 +239,7 @@ static void release_pmc_hardware(void) {} #endif -static bool check_hw_exists(void) +bool check_hw_exists(int num_counters, int num_counters_fixed) { u64 val, val_fail = -1, val_new= ~0; int i, reg, reg_fail = -1, ret = 0; @@ -250,7 +250,7 @@ static bool check_hw_exists(void) * Check to see if the BIOS enabled any of the counters, if so * complain and bail. */ - for (i = 0; i < x86_pmu.num_counters; i++) { + for (i = 0; i < num_counters; i++) { reg = x86_pmu_config_addr(i); ret = rdmsrl_safe(reg, &val); if (ret) @@ -264,12 +264,12 @@ static bool check_hw_exists(void) } } - if (x86_pmu.num_counters_fixed) { + if (num_counters_fixed) { reg = MSR_ARCH_PERFMON_FIXED_CTR_CTRL; ret = rdmsrl_safe(reg, &val); if (ret) goto msr_fail; - for (i = 0; i < x86_pmu.num_counters_fixed; i++) { + for (i = 0; i < num_counters_fixed; i++) { if (fixed_counter_disabled(i, NULL)) continue; if (val & (0x03 << i*4)) { @@ -2012,7 +2012,7 @@ static int __init init_hw_perf_events(void) pmu_check_apic(); /* sanity check that the hardware exists or is emulated */ - if (!check_hw_exists()) + if (!check_hw_exists(x86_pmu.num_counters, x86_pmu.num_counters_fixed)) return 0; pr_cont("%s PMU driver.\n", x86_pmu.name); diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index 109139c..560410c 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h @@ -1024,6 +1024,8 @@ static inline int x86_pmu_rdpmc_index(int index) return x86_pmu.rdpmc_index ? x86_pmu.rdpmc_index(index) : index; } +bool check_hw_exists(int num_counters, int num_counters_fixed); + int x86_add_exclusive(unsigned int what); void x86_del_exclusive(unsigned int what); -- 2.7.4
| |