perf/x86/intel: Hide TSX events when RTM is not supported
0day testing reported a perf test regression on Haswell systems without RTM. Commita5df70c35
hides the in_tx/in_tx_cp attributes when RTM is not available, but the TSX events are still available in sysfs. Due to the missing attributes the event parser fails on those files. Don't show the TSX events in sysfs when RTM is not available on Haswell/Broadwell/Skylake. Fixes:a5df70c354
(perf/x86: Only show format attributes when supported) Reported-by: kernel test robot <xiaolong.ye@intel.com> Tested-by: Jin Yao <yao.jin@linux.intel.com> Signed-off-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: stable@vger.kernel.org Link: https://lkml.kernel.org/r/20171109000718.14137-1-andi@firstfloor.org
This commit is contained in:
parent
516fb7f2e7
commit
58ba4d5a25
1 changed files with 23 additions and 12 deletions
|
@ -3730,6 +3730,19 @@ EVENT_ATTR_STR(cycles-t, cycles_t, "event=0x3c,in_tx=1");
|
|||
EVENT_ATTR_STR(cycles-ct, cycles_ct, "event=0x3c,in_tx=1,in_tx_cp=1");
|
||||
|
||||
static struct attribute *hsw_events_attrs[] = {
|
||||
EVENT_PTR(mem_ld_hsw),
|
||||
EVENT_PTR(mem_st_hsw),
|
||||
EVENT_PTR(td_slots_issued),
|
||||
EVENT_PTR(td_slots_retired),
|
||||
EVENT_PTR(td_fetch_bubbles),
|
||||
EVENT_PTR(td_total_slots),
|
||||
EVENT_PTR(td_total_slots_scale),
|
||||
EVENT_PTR(td_recovery_bubbles),
|
||||
EVENT_PTR(td_recovery_bubbles_scale),
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute *hsw_tsx_events_attrs[] = {
|
||||
EVENT_PTR(tx_start),
|
||||
EVENT_PTR(tx_commit),
|
||||
EVENT_PTR(tx_abort),
|
||||
|
@ -3742,18 +3755,16 @@ static struct attribute *hsw_events_attrs[] = {
|
|||
EVENT_PTR(el_conflict),
|
||||
EVENT_PTR(cycles_t),
|
||||
EVENT_PTR(cycles_ct),
|
||||
EVENT_PTR(mem_ld_hsw),
|
||||
EVENT_PTR(mem_st_hsw),
|
||||
EVENT_PTR(td_slots_issued),
|
||||
EVENT_PTR(td_slots_retired),
|
||||
EVENT_PTR(td_fetch_bubbles),
|
||||
EVENT_PTR(td_total_slots),
|
||||
EVENT_PTR(td_total_slots_scale),
|
||||
EVENT_PTR(td_recovery_bubbles),
|
||||
EVENT_PTR(td_recovery_bubbles_scale),
|
||||
NULL
|
||||
};
|
||||
|
||||
static __init struct attribute **get_hsw_events_attrs(void)
|
||||
{
|
||||
return boot_cpu_has(X86_FEATURE_RTM) ?
|
||||
merge_attr(hsw_events_attrs, hsw_tsx_events_attrs) :
|
||||
hsw_events_attrs;
|
||||
}
|
||||
|
||||
static ssize_t freeze_on_smi_show(struct device *cdev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -4182,7 +4193,7 @@ __init int intel_pmu_init(void)
|
|||
|
||||
x86_pmu.hw_config = hsw_hw_config;
|
||||
x86_pmu.get_event_constraints = hsw_get_event_constraints;
|
||||
x86_pmu.cpu_events = hsw_events_attrs;
|
||||
x86_pmu.cpu_events = get_hsw_events_attrs();
|
||||
x86_pmu.lbr_double_abort = true;
|
||||
extra_attr = boot_cpu_has(X86_FEATURE_RTM) ?
|
||||
hsw_format_attr : nhm_format_attr;
|
||||
|
@ -4221,7 +4232,7 @@ __init int intel_pmu_init(void)
|
|||
|
||||
x86_pmu.hw_config = hsw_hw_config;
|
||||
x86_pmu.get_event_constraints = hsw_get_event_constraints;
|
||||
x86_pmu.cpu_events = hsw_events_attrs;
|
||||
x86_pmu.cpu_events = get_hsw_events_attrs();
|
||||
x86_pmu.limit_period = bdw_limit_period;
|
||||
extra_attr = boot_cpu_has(X86_FEATURE_RTM) ?
|
||||
hsw_format_attr : nhm_format_attr;
|
||||
|
@ -4279,7 +4290,7 @@ __init int intel_pmu_init(void)
|
|||
extra_attr = boot_cpu_has(X86_FEATURE_RTM) ?
|
||||
hsw_format_attr : nhm_format_attr;
|
||||
extra_attr = merge_attr(extra_attr, skl_format_attr);
|
||||
x86_pmu.cpu_events = hsw_events_attrs;
|
||||
x86_pmu.cpu_events = get_hsw_events_attrs();
|
||||
intel_pmu_pebs_data_source_skl(
|
||||
boot_cpu_data.x86_model == INTEL_FAM6_SKYLAKE_X);
|
||||
pr_cont("Skylake events, ");
|
||||
|
|
Loading…
Reference in a new issue