| From ed6101bbf6266ee83e620b19faa7c6ad56bb41ab Mon Sep 17 00:00:00 2001 |
| From: Jiri Olsa <jolsa@kernel.org> |
| Date: Wed, 21 Nov 2018 11:16:10 +0100 |
| Subject: perf/x86/intel: Move branch tracing setup to the Intel-specific source file |
| |
| From: Jiri Olsa <jolsa@kernel.org> |
| |
| commit ed6101bbf6266ee83e620b19faa7c6ad56bb41ab upstream. |
| |
| Moving branch tracing setup to Intel core object into separate |
| intel_pmu_bts_config function, because it's Intel specific. |
| |
| Suggested-by: Peter Zijlstra <peterz@infradead.org> |
| Signed-off-by: Jiri Olsa <jolsa@kernel.org> |
| Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> |
| Cc: <stable@vger.kernel.org> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Arnaldo Carvalho de Melo <acme@kernel.org> |
| Cc: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Stephane Eranian <eranian@google.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Vince Weaver <vincent.weaver@maine.edu> |
| Link: http://lkml.kernel.org/r/20181121101612.16272-1-jolsa@kernel.org |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/events/core.c | 20 -------------------- |
| arch/x86/events/intel/core.c | 41 ++++++++++++++++++++++++++++++++++++++++- |
| 2 files changed, 40 insertions(+), 21 deletions(-) |
| |
| --- a/arch/x86/events/core.c |
| +++ b/arch/x86/events/core.c |
| @@ -437,26 +437,6 @@ int x86_setup_perfctr(struct perf_event |
| if (config == -1LL) |
| return -EINVAL; |
| |
| - /* |
| - * Branch tracing: |
| - */ |
| - if (attr->config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS && |
| - !attr->freq && hwc->sample_period == 1) { |
| - /* BTS is not supported by this architecture. */ |
| - if (!x86_pmu.bts_active) |
| - return -EOPNOTSUPP; |
| - |
| - /* BTS is currently only allowed for user-mode. */ |
| - if (!attr->exclude_kernel) |
| - return -EOPNOTSUPP; |
| - |
| - /* disallow bts if conflicting events are present */ |
| - if (x86_add_exclusive(x86_lbr_exclusive_lbr)) |
| - return -EBUSY; |
| - |
| - event->destroy = hw_perf_lbr_event_destroy; |
| - } |
| - |
| hwc->config |= config; |
| |
| return 0; |
| --- a/arch/x86/events/intel/core.c |
| +++ b/arch/x86/events/intel/core.c |
| @@ -2822,6 +2822,41 @@ static unsigned long intel_pmu_free_runn |
| return flags; |
| } |
| |
| +static int intel_pmu_bts_config(struct perf_event *event) |
| +{ |
| + struct perf_event_attr *attr = &event->attr; |
| + struct hw_perf_event *hwc = &event->hw; |
| + |
| + if (attr->config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS && |
| + !attr->freq && hwc->sample_period == 1) { |
| + /* BTS is not supported by this architecture. */ |
| + if (!x86_pmu.bts_active) |
| + return -EOPNOTSUPP; |
| + |
| + /* BTS is currently only allowed for user-mode. */ |
| + if (!attr->exclude_kernel) |
| + return -EOPNOTSUPP; |
| + |
| + /* disallow bts if conflicting events are present */ |
| + if (x86_add_exclusive(x86_lbr_exclusive_lbr)) |
| + return -EBUSY; |
| + |
| + event->destroy = hw_perf_lbr_event_destroy; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| +static int core_pmu_hw_config(struct perf_event *event) |
| +{ |
| + int ret = x86_pmu_hw_config(event); |
| + |
| + if (ret) |
| + return ret; |
| + |
| + return intel_pmu_bts_config(event); |
| +} |
| + |
| static int intel_pmu_hw_config(struct perf_event *event) |
| { |
| int ret = x86_pmu_hw_config(event); |
| @@ -2829,6 +2864,10 @@ static int intel_pmu_hw_config(struct pe |
| if (ret) |
| return ret; |
| |
| + ret = intel_pmu_bts_config(event); |
| + if (ret) |
| + return ret; |
| + |
| if (event->attr.precise_ip) { |
| if (!event->attr.freq) { |
| event->hw.flags |= PERF_X86_EVENT_AUTO_RELOAD; |
| @@ -3265,7 +3304,7 @@ static __initconst const struct x86_pmu |
| .enable_all = core_pmu_enable_all, |
| .enable = core_pmu_enable_event, |
| .disable = x86_pmu_disable_event, |
| - .hw_config = x86_pmu_hw_config, |
| + .hw_config = core_pmu_hw_config, |
| .schedule_events = x86_schedule_events, |
| .eventsel = MSR_ARCH_PERFMON_EVENTSEL0, |
| .perfctr = MSR_ARCH_PERFMON_PERFCTR0, |