mirror of https://gitee.com/openkylin/linux.git
perf/x86: Add hardware events translations for AMD cpus
Add support for AMD processors to display 'events' sysfs directory (/sys/devices/cpu/events/) with hw event translations: # ls /sys/devices/cpu/events/ branch-instructions branch-misses bus-cycles cache-misses cache-references cpu-cycles instructions ref-cycles stalled-cycles-backend stalled-cycles-frontend Suggested-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Cc: Paul Mackerras <paulus@samba.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Stephane Eranian <eranian@google.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1349873598-12583-5-git-send-email-jolsa@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
43c032febd
commit
0bf79d4413
|
@ -1392,9 +1392,8 @@ static struct attribute_group x86_pmu_events_group = {
|
|||
.attrs = events_attr,
|
||||
};
|
||||
|
||||
ssize_t x86_event_sysfs_show(char *page, u64 config)
|
||||
ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event)
|
||||
{
|
||||
u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT);
|
||||
u64 umask = (config & ARCH_PERFMON_EVENTSEL_UMASK) >> 8;
|
||||
u64 cmask = (config & ARCH_PERFMON_EVENTSEL_CMASK) >> 24;
|
||||
bool edge = (config & ARCH_PERFMON_EVENTSEL_EDGE);
|
||||
|
|
|
@ -538,7 +538,7 @@ static inline void set_linear_ip(struct pt_regs *regs, unsigned long ip)
|
|||
regs->ip = ip;
|
||||
}
|
||||
|
||||
ssize_t x86_event_sysfs_show(char *page, u64 config);
|
||||
ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event);
|
||||
|
||||
#ifdef CONFIG_CPU_SUP_AMD
|
||||
|
||||
|
|
|
@ -568,6 +568,14 @@ amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *ev
|
|||
}
|
||||
}
|
||||
|
||||
static ssize_t amd_event_sysfs_show(char *page, u64 config)
|
||||
{
|
||||
u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT) |
|
||||
(config & AMD64_EVENTSEL_EVENT) >> 24;
|
||||
|
||||
return x86_event_sysfs_show(page, config, event);
|
||||
}
|
||||
|
||||
static __initconst const struct x86_pmu amd_pmu = {
|
||||
.name = "AMD",
|
||||
.handle_irq = x86_pmu_handle_irq,
|
||||
|
@ -591,6 +599,7 @@ static __initconst const struct x86_pmu amd_pmu = {
|
|||
.put_event_constraints = amd_put_event_constraints,
|
||||
|
||||
.format_attrs = amd_format_attr,
|
||||
.events_sysfs_show = amd_event_sysfs_show,
|
||||
|
||||
.cpu_prepare = amd_pmu_cpu_prepare,
|
||||
.cpu_starting = amd_pmu_cpu_starting,
|
||||
|
|
|
@ -1603,6 +1603,13 @@ static struct attribute *intel_arch_formats_attr[] = {
|
|||
NULL,
|
||||
};
|
||||
|
||||
ssize_t intel_event_sysfs_show(char *page, u64 config)
|
||||
{
|
||||
u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT);
|
||||
|
||||
return x86_event_sysfs_show(page, config, event);
|
||||
}
|
||||
|
||||
static __initconst const struct x86_pmu core_pmu = {
|
||||
.name = "core",
|
||||
.handle_irq = x86_pmu_handle_irq,
|
||||
|
@ -1628,7 +1635,7 @@ static __initconst const struct x86_pmu core_pmu = {
|
|||
.event_constraints = intel_core_event_constraints,
|
||||
.guest_get_msrs = core_guest_get_msrs,
|
||||
.format_attrs = intel_arch_formats_attr,
|
||||
.events_sysfs_show = x86_event_sysfs_show,
|
||||
.events_sysfs_show = intel_event_sysfs_show,
|
||||
};
|
||||
|
||||
struct intel_shared_regs *allocate_shared_regs(int cpu)
|
||||
|
@ -1767,7 +1774,7 @@ static __initconst const struct x86_pmu intel_pmu = {
|
|||
.pebs_aliases = intel_pebs_aliases_core2,
|
||||
|
||||
.format_attrs = intel_arch3_formats_attr,
|
||||
.events_sysfs_show = x86_event_sysfs_show,
|
||||
.events_sysfs_show = intel_event_sysfs_show,
|
||||
|
||||
.cpu_prepare = intel_pmu_cpu_prepare,
|
||||
.cpu_starting = intel_pmu_cpu_starting,
|
||||
|
|
Loading…
Reference in New Issue