Commit cadbaa03 authored by Stephane Eranian's avatar Stephane Eranian Committed by Peter Zijlstra

perf/x86/intel: Make anythread filter support conditional

Starting with Arch Perfmon v5, the anythread filter on generic counters may be
deprecated. The current kernel was exporting the any filter without checking.
On Icelake, it means you could do cpu/event=0x3c,any/ even though the filter
does not exist. This patch corrects the problem by relying on the CPUID 0xa leaf
function to determine if anythread is supported or not as described in the
Intel SDM Vol3b 18.2.5.1 AnyThread Deprecation section.
Signed-off-by: default avatarStephane Eranian <eranian@google.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20201028194247.3160610-1-eranian@google.com
parent 1908dc91
...@@ -4987,6 +4987,12 @@ __init int intel_pmu_init(void) ...@@ -4987,6 +4987,12 @@ __init int intel_pmu_init(void)
x86_add_quirk(intel_arch_events_quirk); /* Install first, so it runs last */ x86_add_quirk(intel_arch_events_quirk); /* Install first, so it runs last */
if (version >= 5) {
x86_pmu.intel_cap.anythread_deprecated = edx.split.anythread_deprecated;
if (x86_pmu.intel_cap.anythread_deprecated)
pr_cont(" AnyThread deprecated, ");
}
/* /*
* Install the hw-cache-events table: * Install the hw-cache-events table:
*/ */
...@@ -5512,6 +5518,10 @@ __init int intel_pmu_init(void) ...@@ -5512,6 +5518,10 @@ __init int intel_pmu_init(void)
x86_pmu.intel_ctrl |= x86_pmu.intel_ctrl |=
((1LL << x86_pmu.num_counters_fixed)-1) << INTEL_PMC_IDX_FIXED; ((1LL << x86_pmu.num_counters_fixed)-1) << INTEL_PMC_IDX_FIXED;
/* AnyThread may be deprecated on arch perfmon v5 or later */
if (x86_pmu.intel_cap.anythread_deprecated)
x86_pmu.format_attrs = intel_arch_formats_attr;
if (x86_pmu.event_constraints) { if (x86_pmu.event_constraints) {
/* /*
* event on fixed counter2 (REF_CYCLES) only works on this * event on fixed counter2 (REF_CYCLES) only works on this
......
...@@ -585,6 +585,7 @@ union perf_capabilities { ...@@ -585,6 +585,7 @@ union perf_capabilities {
u64 pebs_baseline:1; u64 pebs_baseline:1;
u64 perf_metrics:1; u64 perf_metrics:1;
u64 pebs_output_pt_available:1; u64 pebs_output_pt_available:1;
u64 anythread_deprecated:1;
}; };
u64 capabilities; u64 capabilities;
}; };
......
...@@ -137,7 +137,9 @@ union cpuid10_edx { ...@@ -137,7 +137,9 @@ union cpuid10_edx {
struct { struct {
unsigned int num_counters_fixed:5; unsigned int num_counters_fixed:5;
unsigned int bit_width_fixed:8; unsigned int bit_width_fixed:8;
unsigned int reserved:19; unsigned int reserved1:2;
unsigned int anythread_deprecated:1;
unsigned int reserved2:16;
} split; } split;
unsigned int full; unsigned int full;
}; };
......
...@@ -672,7 +672,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) ...@@ -672,7 +672,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
edx.split.num_counters_fixed = min(cap.num_counters_fixed, MAX_FIXED_COUNTERS); edx.split.num_counters_fixed = min(cap.num_counters_fixed, MAX_FIXED_COUNTERS);
edx.split.bit_width_fixed = cap.bit_width_fixed; edx.split.bit_width_fixed = cap.bit_width_fixed;
edx.split.reserved = 0; edx.split.anythread_deprecated = 1;
edx.split.reserved1 = 0;
edx.split.reserved2 = 0;
entry->eax = eax.full; entry->eax = eax.full;
entry->ebx = cap.events_mask; entry->ebx = cap.events_mask;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment