perf tools: Several memory events updates
Subsystems (2)
Jiri Olsa
reviewercover perf tools: Several memory events updates
hi,
this is generic part of the c2c patchset. It contains several enhancements for perf mem and script commands:
- display memory events properties in perf script
- perf mem DATALA events support
- few other assorted fixes/options
Also available in here:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
perf/mem
thanks,
jirka
---
Jiri Olsa (23):
perf record: Add --all-user/--all-kernel options
perf tools: Make cl_address global
perf tools: Introduce cl_offset function
perf tools: Add monitored events array
perf mem: Add -e record option
perf mem: Check for memory events support
perf mem: Introduce perf_mem_events__name function
perf mem: Add -l/--ldlat option
perf mem: Add -u/-k options
perf x86 intel: Add DATALA events into sysfs
perf mem: Add Intel DATALA memory events
perf tools: Use ARRAY_SIZE in mem sort display functions
perf tools: Introduce perf_mem__tlb_scnprintf function
perf tools: Introduce perf_mem__lvl_scnprintf function
perf tools: Introduce perf_mem__snp_scnprintf function
perf tools: Introduce perf_mem__lck_scnprintf function
perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes perf script: Add data_src and weight column definitions
perf script: Display addr/data_src/weight columns for raw events perf script: Display data_src values
arch/x86/kernel/cpu/perf_event_intel.c | 39 +++++++++++++ tools/perf/Documentation/perf-record.txt | 6 ++ tools/perf/builtin-mem.c | 96 +++++++++++++++++++++++++++--- tools/perf/builtin-record.c | 4 ++ tools/perf/builtin-script.c | 41 ++++++++++++- tools/perf/perf.h | 2 + tools/perf/util/Build | 1 + tools/perf/util/evsel.c | 10 ++++ tools/perf/util/mem-events.c | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/mem-events.h | 56 ++++++++++++++++++ tools/perf/util/sort.c | 148 ++-------------------------------------------- tools/perf/util/sort.h | 11 ++++ 12 files changed, 551 insertions(+), 152 deletions(-) create mode 100644 tools/perf/util/mem-events.c create mode 100644 tools/perf/util/mem-events.h
Jiri Olsa
reviewerPATCH 1/23 perf record: Add --all-user/--all-kernel options
Allow user to easily switch all events to user or kernel space with simple --all-user or --all-kernel options.
This will be handy within perf mem/c2c wrappers to switch easily monitoring modes.
--- tools/perf/Documentation/perf-record.txt | 6 ++++++ tools/perf/builtin-record.c | 4 ++++ tools/perf/perf.h | 2 ++ tools/perf/util/evsel.c | 10 ++++++++++ 4 files changed, 22 insertions(+)
tools/perf/Documentation/perf-record.txt +6 -0
@@ -341,6 +341,12 @@ Specify vmlinux path which has debuginfo. --buildid-all:: Record build-id of all DSOs regardless whether it's actually hit or not. +--all-kernel:: +Configure all used events to run in kernel space. + +--all-user:: +Configure all used events to run in user space. + SEE ALSO -------- linkperf:perf-stat[1], linkperf:perf-list[1]
tools/perf/builtin-record.c +4 -0
@@ -1151,6 +1151,10 @@ struct option __record_options[] = { "per thread proc mmap processing timeout in ms"),OPT_BOOLEAN (0 ,"switch-events" , &record.opts.record_switch_events,"Record context switch events" ), +OPT_BOOLEAN (0 ,"all-kernel" , &record.opts.all_kernel, +"Configure all used events to run in kernel space." ), +OPT_BOOLEAN (0 ,"all-user" , &record.opts.all_user, +"Configure all used events to run in user space." ),OPT_STRING (0 ,"clang-path" , &llvm_param.clang_path,"clang path" ,"clang binary to use for compiling BPF scriptlets" ), OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
tools/perf/perf.h +2 -0
@@ -58,6 +58,8 @@ struct record_opts {bool full_auxtrace;bool auxtrace_snapshot_mode;bool record_switch_events; +bool all_kernel; +bool all_user;unsigned int freq;unsigned int mmap_pages;unsigned int auxtrace_mmap_pages;
tools/perf/util/evsel.c +10 -0
@@ -898,6 +898,16 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)if (evsel->precise_max)perf_event_attr__set_max_precise_ip (attr); +if (opts->all_user) { + attr->exclude_kernel =1 ; + attr->exclude_user =0 ; + } + +if (opts->all_kernel) { + attr->exclude_kernel =0 ; + attr->exclude_user =1 ; + } +/* * Apply event specific term settings, * it overloads any global configuration.
Signature · 1 line
2.4.3
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
Em Mon, Feb 15, 2016 at 09:34:31AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Allow user to easily switch all events to user or kernel space with simple --all-user or --all-kernel options.
This will be handy within perf mem/c2c wrappers to switch easily monitoring modes.
Humm, some oddities:
# perf record --all-user -e cycles -a
# perf report --tui # And then notice there are some kernel samples, zoom into kernel DSO
Samples: 7 of event 'cycles', Event count (approx.): 3158810, DSO: [kernel.vmlinux]
Overhead Comman Symbol
84.05% chrome [k] page_fault
15.73% chrome [k] entry_SYSCALL_64
0.22% chrome [k] apic_timer_interruptDitto when using --all-kernel, some userspace samples are there, also perhaps we should show "cycles:u" or "cycles:k" when this --all-user or --all-kernel features are used.
Need to investigate why there are kernel samples when --all-user is used and the other way around as well.
Also if I use both it quietly accepts and shows just one of them, I guess we should bail out in case someone tries both.
- Arnaldo
Quoted 77 lines
Signed-off-by Jiri Olsa <[email protected]>--- tools/perf/Documentation/perf-record.txt | 6 ++++++ tools/perf/builtin-record.c | 4 ++++ tools/perf/perf.h | 2 ++ tools/perf/util/evsel.c | 10 ++++++++++ 4 files changed, 22 insertions(+)tools/perf/Documentation/perf-record.txt +6
-0@@ -341,6 +341,12 @@ Specify vmlinux path which has debuginfo. --buildid-all:: Record build-id of all DSOs regardless whether it's actually hit or not. +--all-kernel:: +Configure all used events to run in kernel space. + +--all-user:: +Configure all used events to run in user space. + SEE ALSO -------- linkperf:perf-stat[1], linkperf:perf-list[1]tools/perf/builtin-record.c +4
-0@@ -1151,6 +1151,10 @@ struct option __record_options[] = { "per thread proc mmap processing timeout in ms"),OPT_BOOLEAN (0 ,"switch-events" , &record.opts.record_switch_events,"Record context switch events" ), +OPT_BOOLEAN (0 ,"all-kernel" , &record.opts.all_kernel, +"Configure all used events to run in kernel space." ), +OPT_BOOLEAN (0 ,"all-user" , &record.opts.all_user, +"Configure all used events to run in user space." ),OPT_STRING (0 ,"clang-path" , &llvm_param.clang_path,"clang path" ,"clang binary to use for compiling BPF scriptlets" ), OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",tools/perf/perf.h +2
-0@@ -58,6 +58,8 @@ struct record_opts {bool full_auxtrace;bool auxtrace_snapshot_mode;bool record_switch_events; +bool all_kernel; +bool all_user;unsigned int freq;unsigned int mmap_pages;unsigned int auxtrace_mmap_pages;tools/perf/util/evsel.c +10
-0@@ -898,6 +898,16 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)if (evsel->precise_max)perf_event_attr__set_max_precise_ip (attr); +if (opts->all_user) { + attr->exclude_kernel =1 ; + attr->exclude_user =0 ; + } + +if (opts->all_kernel) { + attr->exclude_kernel =0 ; + attr->exclude_user =1 ; + } +/* * Apply event specific term settings, * it overloads any global configuration. Signature · 1 line
2.4.3
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
Quoted 2 lines
Need to investigate why there are kernel samples when --all-user is used and the other way around as well.
This is a known issue due to skid. PEBS usually avoids it.
-Andi
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
Em Tue, Feb 16, 2016 at 07:10:37PM -0800, Andi Kleen escreveu:
Quoted 4 lines
Quoted 2 lines
Need to investigate why there are kernel samples when --all-user is used and the other way around as well.
This is a known issue due to skid. PEBS usually avoids it.
Right, thanks for pointing this out, we have to detect that :p is not being used and warn the user about this possibility, i.e. user asks for just kernel samples, tool finds user samples, tell that using :p+ may help.
Now, using plain:
# perf record --all-user -a sleep 2
will make it use the default which is 'cycles' with the highest precision available on the machine, and that leaves just a few samples that supposedly have the MISC_KERNEL bit set in the perf_event_attr header, those are not mapping to any mmap area known to the tool, I'm investigating what this is.
I'll apply the patch as-is, we'll check later OPT_ magic to tell that those options are mutually exclusive.
- Arnaldo
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
Quoted 10 lines · Arnaldo Carvalho de Melo
Em Tue, Feb 16, 2016 at 07:10:37PM -0800, Andi Kleen escreveu:
Quoted 4 lines
Quoted 2 lines
Need to investigate why there are kernel samples when --all-user is used and the other way around as well.
This is a known issue due to skid. PEBS usually avoids it.
Right, thanks for pointing this out, we have to detect that :p is not being used and warn the user about this possibility, i.e. user asks for just kernel samples, tool finds user samples, tell that using :p+ may help.
If you're really so worried about it the kernel driver could filter it.
-Andi
Re: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
In reply to Arnaldo Carvalho de MeloQuoted 22 lines · Arnaldo Carvalho de Melo
Em Mon, Feb 15, 2016 at 09:34:31AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Allow user to easily switch all events to user or kernel space with simple --all-user or --all-kernel options.
This will be handy within perf mem/c2c wrappers to switch easily monitoring modes.
Humm, some oddities:
# perf record --all-user -e cycles -a # perf report --tui # And then notice there are some kernel samples, zoom into kernel DSO Samples: 7 of event 'cycles', Event count (approx.): 3158810, DSO: [kernel.vmlinux] Overhead Comman Symbol 84.05% chrome [k] page_fault 15.73% chrome [k] entry_SYSCALL_64 0.22% chrome [k] apic_timer_interruptDitto when using --all-kernel, some userspace samples are there, also perhaps we should show "cycles:u" or "cycles:k" when this --all-user or --all-kernel features are used.
Quoted 5 lines
Need to investigate why there are kernel samples when --all-user is used and the other way around as well.
Also if I use both it quietly accepts and shows just one of them, I guess we should bail out in case someone tries both.
right, that should be handled with warning and exit I'll do it in next version
thanks,
jirka
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 01/23] perf record: Add --all-user/--all-kernel options
Em Wed, Feb 17, 2016 at 03:39:38PM +0100, Jiri Olsa escreveu:
Quoted 23 lines · Arnaldo Carvalho de Melo
Quoted 22 lines
Em Mon, Feb 15, 2016 at 09:34:31AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Allow user to easily switch all events to user or kernel space with simple --all-user or --all-kernel options.
This will be handy within perf mem/c2c wrappers to switch easily monitoring modes.
Humm, some oddities:
# perf record --all-user -e cycles -a # perf report --tui # And then notice there are some kernel samples, zoom into kernel DSO Samples: 7 of event 'cycles', Event count (approx.): 3158810, DSO: [kernel.vmlinux] Overhead Comman Symbol 84.05% chrome [k] page_fault 15.73% chrome [k] entry_SYSCALL_64 0.22% chrome [k] apic_timer_interruptDitto when using --all-kernel, some userspace samples are there, also perhaps we should show "cycles:u" or "cycles:k" when this --all-user or --all-kernel features are used.
Quoted 8 lines
Quoted 5 lines
Need to investigate why there are kernel samples when --all-user is used and the other way around as well.
Also if I use both it quietly accepts and shows just one of them, I guess we should bail out in case someone tries both.
right, that should be handled with warning and exit I'll do it in next version
Ok, so I'll wait for it then,
builtin-probe.c uses things like:
set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE);
set_option_flag(options, 'd', "del", PARSE_OPT_EXCLUSIVE);We have:
#define OPT_BOOLEAN_FLAG(s, l, v, h, f) { .type = OPTION_BOOLEAN,
.short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h), .flags = (f) }
That allows setting that PARSE_OPT_EXCLUSIVE flag, but we don't have _FLAG variants for all opt types, for instance there is no OPT_CALLBACK_FLAG() that could be used in builtin-probe.c to avoid those unconditional set_option_flag(EXCLUSIVE) :-\
- Arnaldo
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf record: Add --all-user/--all-kernel options
In reply to Jiri Olsaperf record: Add --all-user/--all-kernel options
Commit-ID: 85723885feb823b4fc352b727ece0b6d00306c4d Gitweb: http://git.kernel.org/tip/85723885feb823b4fc352b727ece0b6d00306c4d Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:31 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 18 Feb 2016 10:48:44 -0300
perf record: Add --all-user/--all-kernel options
Allow user to easily switch all events to user or kernel space with simple --all-user or --all-kernel options.
This will be handy within perf mem/c2c wrappers to switch easily monitoring modes.
Committer note:
Testing it:
# perf record --all-kernel --all-user -a sleep 2
Error: option `all-user' cannot be used with all-kernel
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>] --all-user Configure all used events to run in user space.
--all-kernel Configure all used events to run in kernel space.
# perf record --all-user --all-kernel -a sleep 2
Error: option `all-kernel' cannot be used with all-user
Usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>] --all-kernel Configure all used events to run in kernel space.
--all-user Configure all used events to run in user space.
# perf record --all-user -a sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 1.416 MB perf.data (162 samples) ] # perf report | grep '\[k\]' # perf record --all-kernel -a sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 1.423 MB perf.data (296 samples) ] # perf report | grep '\[\.\]' #
--- tools/perf/Documentation/perf-record.txt | 6 ++++++ tools/perf/builtin-record.c | 6 ++++++ tools/perf/perf.h | 2 ++ tools/perf/util/evsel.c | 10 ++++++++++ 4 files changed, 24 insertions(+)
tools/perf/Documentation/perf-record.txt +6 -0
@@ -341,6 +341,12 @@ Specify vmlinux path which has debuginfo. --buildid-all:: Record build-id of all DSOs regardless whether it's actually hit or not. +--all-kernel:: +Configure all used events to run in kernel space. + +--all-user:: +Configure all used events to run in user space. + SEE ALSO -------- linkperf:perf-stat[1], linkperf:perf-list[1]
tools/perf/builtin-record.c +6 -0
@@ -1140,6 +1140,12 @@ struct option __record_options[] = { "per thread proc mmap processing timeout in ms"),OPT_BOOLEAN (0 ,"switch-events" , &record.opts.record_switch_events,"Record context switch events" ), +OPT_BOOLEAN_FLAG (0 ,"all-kernel" , &record.opts.all_kernel, +"Configure all used events to run in kernel space." , +PARSE_OPT_EXCLUSIVE ), +OPT_BOOLEAN_FLAG (0 ,"all-user" , &record.opts.all_user, +"Configure all used events to run in user space." , +PARSE_OPT_EXCLUSIVE ),OPT_STRING (0 ,"clang-path" , &llvm_param.clang_path,"clang path" ,"clang binary to use for compiling BPF scriptlets" ), OPT_STRING(0, "clang-opt", &llvm_param.clang_opt, "clang options",
tools/perf/perf.h +2 -0
@@ -58,6 +58,8 @@ struct record_opts {bool full_auxtrace;bool auxtrace_snapshot_mode;bool record_switch_events; +bool all_kernel; +bool all_user;unsigned int freq;unsigned int mmap_pages;unsigned int auxtrace_mmap_pages;
tools/perf/util/evsel.c +10 -0
@@ -898,6 +898,16 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)if (evsel->precise_max)perf_event_attr__set_max_precise_ip (attr); +if (opts->all_user) { + attr->exclude_kernel =1 ; + attr->exclude_user =0 ; + } + +if (opts->all_kernel) { + attr->exclude_kernel =0 ; + attr->exclude_user =1 ; + } +/* * Apply event specific term settings, * it overloads any global configuration.
Jiri Olsa
reviewerPATCH 2/23 perf tools: Make cl_address global
In reply to Jiri OlsaIt'll be used in following patches.
--- tools/perf/util/sort.c | 6 ------ tools/perf/util/sort.h | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-)
tools/perf/util/sort.c +0 -6
@@ -1020,12 +1020,6 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,return repsep_snprintf (bf, size,"%-*s" , width, out); } -static inline u64 cl_address (u64 address) -{ -/* return the cacheline of the address */ -return (address & ~(cacheline_size -1 )); -} -static int64_t sort__dcacheline_cmp (struct hist_entry *left,struct hist_entry *right) {
tools/perf/util/sort.h +5 -0
@@ -162,6 +162,11 @@ static inline float hist_entry__get_percent_limit(struct hist_entry *he)return period *100.0 / total_period; } +static inline u64 cl_address (u64 address) +{ +/* return the cacheline of the address */ +return (address & ~(cacheline_size -1 )); +}enum sort_mode {SORT_MODE__NORMAL ,
Signature · 1 line
2.4.3
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Make cl_address global
perf tools: Make cl_address global
Commit-ID: e95cf700b1b267d912ee779c3ab36e582111a52d Gitweb: http://git.kernel.org/tip/e95cf700b1b267d912ee779c3ab36e582111a52d Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:32 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 23 Feb 2016 12:09:02 -0300
perf tools: Make cl_address global
It'll be used in following patches.
--- tools/perf/util/sort.c | 6 ------ tools/perf/util/sort.h | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-)
tools/perf/util/sort.c +0 -6
@@ -1015,12 +1015,6 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,return repsep_snprintf (bf, size,"%-*s" , width, out); } -static inline u64 cl_address (u64 address) -{ -/* return the cacheline of the address */ -return (address & ~(cacheline_size -1 )); -} -static int64_t sort__dcacheline_cmp (struct hist_entry *left,struct hist_entry *right) {
tools/perf/util/sort.h +5 -0
@@ -162,6 +162,11 @@ static inline float hist_entry__get_percent_limit(struct hist_entry *he)return period *100.0 / total_period; } +static inline u64 cl_address (u64 address) +{ +/* return the cacheline of the address */ +return (address & ~(cacheline_size -1 )); +}enum sort_mode {SORT_MODE__NORMAL ,
Jiri Olsa
reviewerPATCH 3/23 perf tools: Introduce cl_offset function
In reply to Jiri OlsaIt'll be used in following patches.
--- tools/perf/util/sort.h | 6 ++++++ 1 file changed, 6 insertions(+)
tools/perf/util/sort.h +6 -0
@@ -168,6 +168,12 @@ static inline u64 cl_address(u64 address)return (address & ~(cacheline_size -1 )); } +static inline u64 cl_offset (u64 address) +{ +/* return the cacheline of the address */ +return (address & (cacheline_size -1 )); +} +enum sort_mode {SORT_MODE__NORMAL ,SORT_MODE__BRANCH ,
Signature · 1 line
2.4.3
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Introduce cl_offset function
perf tools: Introduce cl_offset function
Commit-ID: d392711095f12942a61e2963f5ab0076ac651e73 Gitweb: http://git.kernel.org/tip/d392711095f12942a61e2963f5ab0076ac651e73 Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:33 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 23 Feb 2016 12:09:22 -0300
perf tools: Introduce cl_offset function
It'll be used in following patches.
--- tools/perf/util/sort.h | 6 ++++++ 1 file changed, 6 insertions(+)
tools/perf/util/sort.h +6 -0
@@ -168,6 +168,12 @@ static inline u64 cl_address(u64 address)return (address & ~(cacheline_size -1 )); } +static inline u64 cl_offset (u64 address) +{ +/* return the cacheline of the address */ +return (address & (cacheline_size -1 )); +} +enum sort_mode {SORT_MODE__NORMAL ,SORT_MODE__BRANCH ,
Jiri Olsa
reviewerPATCH 4/23 perf tools: Add monitored events array
In reply to Jiri OlsaIt will ease up configuration of memory events
and addition of other memory events in following
patches.
--- tools/perf/builtin-mem.c | 17 +++++++++-------- tools/perf/util/Build | 1 + tools/perf/util/mem-events.c | 10 ++++++++++ tools/perf/util/mem-events.h | 20 ++++++++++++++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 tools/perf/util/mem-events.c create mode 100644 tools/perf/util/mem-events.h
tools/perf/builtin-mem.c +9 -8
@@ -6,6 +6,7 @@#include "util/tool.h" #include "util/session.h" #include "util/data.h" +#include "util/mem-events.h" #define MEM_OPERATION_LOAD 0x1#define MEM_OPERATION_STORE 0x2
@@ -34,20 +35,20 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) rec_argv[i++] ="record" ; -if (mem->operation &MEM_OPERATION_LOAD ) +if (mem->operation &MEM_OPERATION_LOAD ) { + perf_mem_events[PERF_MEM_EVENTS__LOAD ].record = true; rec_argv[i++] ="-W" ; + } rec_argv[i++] ="-d" ; -if (mem->operation &MEM_OPERATION_LOAD ) { - rec_argv[i++] ="-e" ; - rec_argv[i++] ="cpu/mem-loads/pp" ; - } +for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) { +if (!perf_mem_events[j].record) +continue ; -if (mem->operation &MEM_OPERATION_STORE ) { rec_argv[i++] ="-e" ; - rec_argv[i++] ="cpu/mem-stores/pp" ; - } + rec_argv[i++] = perf_mem_events[j].name; + };for (j =1 ; j < argc; j++, i++) rec_argv[i] = argv[j];
tools/perf/util/Build +1 -0
@@ -82,6 +82,7 @@ libperf-y += parse-branch-options.o libperf-y += parse-regs-options.o libperf-y += term.o libperf-y += help-unknown-cmd.o +libperf-y += mem-events.o libperf-$(CONFIG_LIBBPF) += bpf-loader.o libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
tools/perf/util/mem-events.c new file +10 -0
@@ -0,0 +1,10 @@ +#include "mem-events.h" + +#define E (n) { .name = n } + +struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ] = { +E ("cpu/mem-loads,ldlat=30/P" ), +E ("cpu/mem-stores/P" ), +}; + +#undef E
tools/perf/util/mem-events.h new file +20 -0
@@ -0,0 +1,20 @@ +#ifndef __PERF_MEM_EVENTS_H +#define __PERF_MEM_EVENTS_H + +#include <stdbool.h> + +struct perf_mem_event { +bool record; +const char *name; +}; + +enum { +PERF_MEM_EVENTS__LOAD , +PERF_MEM_EVENTS__STORE , +PERF_MEM_EVENTS__MAX , +}; + +extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ]; + +#endif /* __PERF_MEM_EVENTS_H */ +
Signature · 1 line
2.4.3
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 04/23] perf tools: Add monitored events array
Em Mon, Feb 15, 2016 at 09:34:34AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
It will ease up configuration of memory events
and addition of other memory events in following
patches.Signed-off-by Jiri Olsa <[email protected]>
Please check your .git/hooks, fixing it this time:
[acme@jouet linux]$ am /wb/1.patch
Applying: perf tools: Add monitored events array /home/acme/git/linux/.git/rebase-apply/patch:104: new blank line at EOF. +
warning: 1 line adds whitespace errors. tools/perf/util/mem-events.h:20: new blank line at EOF. [acme@jouet linux]$
Re: [PATCH 04/23] perf tools: Add monitored events array
Quoted 9 lines · Arnaldo Carvalho de Melo
Em Mon, Feb 15, 2016 at 09:34:34AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
It will ease up configuration of memory events
and addition of other memory events in following
patches.Signed-off-by Jiri Olsa <[email protected]>Please check your .git/hooks, fixing it this time:
hum, I don't have any ;-) will check, thanks
jirka
Quoted 9 lines
[acme@jouet linux]$ am /wb/1.patch
Applying: perf tools: Add monitored events array/home/acme/git/linux/.git/rebase-apply/patch:104: new blank line at EOF. +
warning: 1 line adds whitespace errors.tools/perf/util/mem-events.h:20: new blank line at EOF. [acme@jouet linux]$
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Add monitored events array
In reply to Jiri Olsaperf tools: Add monitored events array
Commit-ID: acbe613e0c03d59cab21aec3565cdb28c7df98c3 Gitweb: http://git.kernel.org/tip/acbe613e0c03d59cab21aec3565cdb28c7df98c3 Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:34 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 23 Feb 2016 12:11:06 -0300
perf tools: Add monitored events array
It will ease up configuration of memory events and addition of other memory events in following patches.
--- tools/perf/builtin-mem.c | 17 +++++++++-------- tools/perf/util/Build | 1 + tools/perf/util/mem-events.c | 10 ++++++++++ tools/perf/util/mem-events.h | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 8 deletions(-)
tools/perf/builtin-mem.c +9 -8
@@ -6,6 +6,7 @@#include "util/tool.h" #include "util/session.h" #include "util/data.h" +#include "util/mem-events.h" #define MEM_OPERATION_LOAD 0x1#define MEM_OPERATION_STORE 0x2
@@ -34,20 +35,20 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) rec_argv[i++] ="record" ; -if (mem->operation &MEM_OPERATION_LOAD ) +if (mem->operation &MEM_OPERATION_LOAD ) { + perf_mem_events[PERF_MEM_EVENTS__LOAD ].record = true; rec_argv[i++] ="-W" ; + } rec_argv[i++] ="-d" ; -if (mem->operation &MEM_OPERATION_LOAD ) { - rec_argv[i++] ="-e" ; - rec_argv[i++] ="cpu/mem-loads/pp" ; - } +for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) { +if (!perf_mem_events[j].record) +continue ; -if (mem->operation &MEM_OPERATION_STORE ) { rec_argv[i++] ="-e" ; - rec_argv[i++] ="cpu/mem-stores/pp" ; - } + rec_argv[i++] = perf_mem_events[j].name; + };for (j =1 ; j < argc; j++, i++) rec_argv[i] = argv[j];
tools/perf/util/Build +1 -0
@@ -82,6 +82,7 @@ libperf-y += parse-branch-options.o libperf-y += parse-regs-options.o libperf-y += term.o libperf-y += help-unknown-cmd.o +libperf-y += mem-events.o libperf-$(CONFIG_LIBBPF) += bpf-loader.o libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
tools/perf/util/mem-events.c new file +10 -0
@@ -0,0 +1,10 @@ +#include "mem-events.h" + +#define E (n) { .name = n } + +struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ] = { +E ("cpu/mem-loads,ldlat=30/P" ), +E ("cpu/mem-stores/P" ), +}; + +#undef E
tools/perf/util/mem-events.h new file +19 -0
@@ -0,0 +1,19 @@ +#ifndef __PERF_MEM_EVENTS_H +#define __PERF_MEM_EVENTS_H + +#include <stdbool.h> + +struct perf_mem_event { +bool record; +const char *name; +}; + +enum { +PERF_MEM_EVENTS__LOAD , +PERF_MEM_EVENTS__STORE , +PERF_MEM_EVENTS__MAX , +}; + +extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ]; + +#endif /* __PERF_MEM_EVENTS_H */
Jiri Olsa
reviewerPATCH 5/23 perf mem: Add -e record option
In reply to Jiri OlsaAdding -e option for perf mem record command,
to be able to specify memory event directly.
Get list of available events:
$ perf mem record -e list ldlat-loads ldlat-stores
Monitor ldlat-loads:
$ perf mem record -e ldlat-loads true
--- tools/perf/builtin-mem.c | 63 +++++++++++++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.c | 47 ++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.h | 3 +++ 3 files changed, 106 insertions(+), 7 deletions(-)
tools/perf/builtin-mem.c +59 -4
@@ -7,6 +7,7 @@#include "util/session.h" #include "util/data.h" #include "util/mem-events.h" +#include "util/debug.h" #define MEM_OPERATION_LOAD 0x1#define MEM_OPERATION_STORE 0x2
@@ -22,11 +23,55 @@ struct perf_mem {DECLARE_BITMAP (cpu_bitmap,MAX_NR_CPUS ); }; +static int parse_record_events (const struct option *opt, +const char *str,int unset__maybe_unused ) +{ +struct perf_mem *mem = *(struct perf_mem **)opt->value; +int j; + +if (strcmp (str,"list" )) { +if (!perf_mem_events__parse (str)) { + mem->operation =0 ; +return 0 ; + } +exit (-1 ); + } + +for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) { +struct perf_mem_event *e = &perf_mem_events[j]; + +fprintf (stderr,"%-20s%s" , + e->tag, verbose ?"" :"\n" ); +if (verbose) +fprintf (stderr," [%s]\n" , e->name); + } +exit (0 ); +} + +static const char *const __usage[] = { +"perf mem record [<options>] [<command>]" , +"perf mem record [<options>] -- <command> [<options>]" , +NULL +}; + +static const char *const *record_mem_usage = __usage; +static int __cmd_record (int argc,const char **argv,struct perf_mem *mem) {int rec_argc, i =0 , j;const char **rec_argv;int ret; +struct option options[] = { +OPT_CALLBACK ('e' ,"event" , &mem,"event" , +"event selector. use 'perf mem record -e list' to list available events" , + parse_record_events), +OPT_INCR ('v' ,"verbose" , &verbose, +"be more verbose (show counter open errors, etc)" ), +OPT_END () + }; + + argc =parse_options (argc, argv, options, record_mem_usage, +PARSE_OPT_STOP_AT_NON_OPTION ); rec_argc = argc +7 ;/* max number of arguments */ rec_argv =calloc (rec_argc +1 ,sizeof (char *));
@@ -35,10 +80,11 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) rec_argv[i++] ="record" ; -if (mem->operation &MEM_OPERATION_LOAD ) { +if (mem->operation &MEM_OPERATION_LOAD ) perf_mem_events[PERF_MEM_EVENTS__LOAD ].record = true; + +if (perf_mem_events[PERF_MEM_EVENTS__LOAD ].record) rec_argv[i++] ="-W" ; - } rec_argv[i++] ="-d" ;
@@ -50,9 +96,19 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) rec_argv[i++] = perf_mem_events[j].name; }; -for (j =1 ; j < argc; j++, i++) +for (j =0 ; j < argc; j++, i++) rec_argv[i] = argv[j]; +if (verbose >0 ) { +pr_debug ("calling: record " ); + +while (rec_argv[j]) { +pr_debug ("%s " , rec_argv[j]); + j++; + } +pr_debug ("\n" ); + } + ret =cmd_record (i, rec_argv,NULL );free (rec_argv);return ret;
@@ -299,7 +355,6 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused) NULL }; - argc =parse_options_subcommand (argc, argv, mem_options, mem_subcommands, mem_usage,PARSE_OPT_STOP_AT_NON_OPTION );
tools/perf/util/mem-events.c +44 -3
54 lines not on this page · raw message
tools/perf/util/mem-events.h +3 -0
@@ -5,6 +5,7 @@struct perf_mem_event {bool record; +const char *tag;const char *name; };
@@ -16,5 +17,7 @@ enum {extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ]; +int perf_mem_events__parse (const char *str); +#endif /* __PERF_MEM_EVENTS_H */
Signature · 1 line
2.4.3
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf mem: Add -e record option
perf mem: Add -e record option
Commit-ID: ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2 Gitweb: http://git.kernel.org/tip/ce1e22b08f0728e840614d3d0fc43fd1d6b7f7a2 Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:35 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 23 Feb 2016 12:15:59 -0300
perf mem: Add -e record option
Adding -e option for perf mem record command, to be able to specify memory event directly.
Get list of available events:
$ perf mem record -e list ldlat-loads ldlat-stores
Monitor ldlat-loads:
$ perf mem record -e ldlat-loads true
Committer notes:
Further testing:
# perf mem record -e ldlat-loads true [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.020 MB perf.data (10 samples) ] # perf evlist cpu/mem-loads,ldlat=30/P #
--- tools/perf/builtin-mem.c | 63 +++++++++++++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.c | 47 ++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.h | 3 +++ 3 files changed, 106 insertions(+), 7 deletions(-)
tools/perf/builtin-mem.c +59 -4
@@ -7,6 +7,7 @@#include "util/session.h" #include "util/data.h" #include "util/mem-events.h" +#include "util/debug.h" #define MEM_OPERATION_LOAD 0x1#define MEM_OPERATION_STORE 0x2
@@ -22,11 +23,55 @@ struct perf_mem {DECLARE_BITMAP (cpu_bitmap,MAX_NR_CPUS ); }; +static int parse_record_events (const struct option *opt, +const char *str,int unset__maybe_unused ) +{ +struct perf_mem *mem = *(struct perf_mem **)opt->value; +int j; + +if (strcmp (str,"list" )) { +if (!perf_mem_events__parse (str)) { + mem->operation =0 ; +return 0 ; + } +exit (-1 ); + } + +for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) { +struct perf_mem_event *e = &perf_mem_events[j]; + +fprintf (stderr,"%-20s%s" , + e->tag, verbose ?"" :"\n" ); +if (verbose) +fprintf (stderr," [%s]\n" , e->name); + } +exit (0 ); +} + +static const char *const __usage[] = { +"perf mem record [<options>] [<command>]" , +"perf mem record [<options>] -- <command> [<options>]" , +NULL +}; + +static const char *const *record_mem_usage = __usage; +static int __cmd_record (int argc,const char **argv,struct perf_mem *mem) {int rec_argc, i =0 , j;const char **rec_argv;int ret; +struct option options[] = { +OPT_CALLBACK ('e' ,"event" , &mem,"event" , +"event selector. use 'perf mem record -e list' to list available events" , + parse_record_events), +OPT_INCR ('v' ,"verbose" , &verbose, +"be more verbose (show counter open errors, etc)" ), +OPT_END () + }; + + argc =parse_options (argc, argv, options, record_mem_usage, +PARSE_OPT_STOP_AT_NON_OPTION ); rec_argc = argc +7 ;/* max number of arguments */ rec_argv =calloc (rec_argc +1 ,sizeof (char *));
@@ -35,10 +80,11 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) rec_argv[i++] ="record" ; -if (mem->operation &MEM_OPERATION_LOAD ) { +if (mem->operation &MEM_OPERATION_LOAD ) perf_mem_events[PERF_MEM_EVENTS__LOAD ].record = true; + +if (perf_mem_events[PERF_MEM_EVENTS__LOAD ].record) rec_argv[i++] ="-W" ; - } rec_argv[i++] ="-d" ;
@@ -50,9 +96,19 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) rec_argv[i++] = perf_mem_events[j].name; }; -for (j =1 ; j < argc; j++, i++) +for (j =0 ; j < argc; j++, i++) rec_argv[i] = argv[j]; +if (verbose >0 ) { +pr_debug ("calling: record " ); + +while (rec_argv[j]) { +pr_debug ("%s " , rec_argv[j]); + j++; + } +pr_debug ("\n" ); + } + ret =cmd_record (i, rec_argv,NULL );free (rec_argv);return ret;
@@ -299,7 +355,6 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused) NULL }; - argc =parse_options_subcommand (argc, argv, mem_options, mem_subcommands, mem_usage,PARSE_OPT_STOP_AT_NON_OPTION );
tools/perf/util/mem-events.c +44 -3
54 lines not on this page · raw message
tools/perf/util/mem-events.h +3 -0
@@ -5,6 +5,7 @@struct perf_mem_event {bool record; +const char *tag;const char *name; };
@@ -16,4 +17,6 @@ enum {extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ]; +int perf_mem_events__parse (const char *str); +#endif /* __PERF_MEM_EVENTS_H */
Jiri Olsa
reviewerPATCH 6/23 perf mem: Check for memory events support
In reply to Jiri OlsaCheck if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list [ok] ldlat-loads [ok] ldlat-stores
--- tools/perf/builtin-mem.c | 14 +++++++++++++- tools/perf/util/mem-events.c | 35 ++++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.h | 3 +++ 3 files changed, 48 insertions(+), 4 deletions(-)
tools/perf/builtin-mem.c +13 -1
@@ -40,7 +40,8 @@ static int parse_record_events(const struct option *opt,for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) {struct perf_mem_event *e = &perf_mem_events[j]; -fprintf (stderr,"%-20s%s" , +fprintf (stderr,"%s%-20s%s" , + e->supported ?"[ok] " :" " , e->tag, verbose ?"" :"\n" );if (verbose)fprintf (stderr," [%s]\n" , e->name);
@@ -92,6 +93,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)if (!perf_mem_events[j].record)continue ; +if (!perf_mem_events[j].supported) { +pr_err ("failed: event '%s' not supported\n" , + perf_mem_events[j].name); +return -1 ; + } + rec_argv[i++] ="-e" ; rec_argv[i++] = perf_mem_events[j].name; };
@@ -355,6 +362,11 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused) NULL }; +if (perf_mem_events__init ()) { +pr_err ("failed: memory events not supported\n" ); +return -1 ; + } + argc =parse_options_subcommand (argc, argv, mem_options, mem_subcommands, mem_usage,PARSE_OPT_STOP_AT_NON_OPTION );
tools/perf/util/mem-events.c +32 -3
@@ -2,15 +2,20 @@#include <stdlib.h> #include <string.h> #include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <api/fs/fs.h> #include "mem-events.h" #include "debug.h" -#define E (t, n) { .tag = t, .name = n } +#define E (t, n, s) { .tag = t, .name = n, .sysfs_name = s }struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ] = { -E ("ldlat-loads" ,"cpu/mem-loads,ldlat=30/P" ), -E ("ldlat-stores" ,"cpu/mem-stores/P" ), +E ("ldlat-loads" ,"cpu/mem-loads,ldlat=30/P" ,"mem-loads" ), +E ("ldlat-stores" ,"cpu/mem-stores/P" ,"mem-stores" ), }; +#undef E#undef E
@@ -49,3 +54,27 @@ int perf_mem_events__parse(const char *str)pr_err ("failed: event '%s' not found, use '-e list' to get list of available events\n" , str);return -1 ; } + +int perf_mem_events__init (void ) +{ +const char *mnt =sysfs__mount (); +bool found = false; +int j; + +if (!mnt) +return -ENOENT ; + +for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) { +char path[PATH_MAX ]; +struct perf_mem_event *e = &perf_mem_events[j]; +struct stat st; + +scnprintf (path,PATH_MAX ,"%s/devices/cpu/events/%s" , + mnt, e->sysfs_name); + +if (!stat (path, &st)) + e->supported = found = true; + } + +return found ?0 : -ENOENT ; +}
tools/perf/util/mem-events.h +3 -0
@@ -5,8 +5,10 @@struct perf_mem_event {bool record; +bool supported;const char *tag;const char *name; +const char *sysfs_name; };enum {
@@ -18,6 +20,7 @@ enum {extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ];int perf_mem_events__parse (const char *str); +int perf_mem_events__init (void );#endif /* __PERF_MEM_EVENTS_H */
Signature · 1 line
2.4.3
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 06/23] perf mem: Check for memory events support
Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Check if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list [ok] ldlat-loads [ok] ldlat-stores
Can't this be:
$ perf mem record -e list ldlat-loads: Available on this machine ldlat-stores: Available on this machine
- Arnaldo
Quoted 128 lines
Signed-off-by Jiri Olsa <[email protected]>--- tools/perf/builtin-mem.c | 14 +++++++++++++- tools/perf/util/mem-events.c | 35 ++++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.h | 3 +++ 3 files changed, 48 insertions(+), 4 deletions(-)tools/perf/builtin-mem.c +13
-1@@ -40,7 +40,8 @@ static int parse_record_events(const struct option *opt,for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) {struct perf_mem_event *e = &perf_mem_events[j]; -fprintf (stderr,"%-20s%s" , +fprintf (stderr,"%s%-20s%s" , + e->supported ?"[ok] " :" " , e->tag, verbose ?"" :"\n" );if (verbose)fprintf (stderr," [%s]\n" , e->name);@@ -92,6 +93,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)if (!perf_mem_events[j].record)continue ; +if (!perf_mem_events[j].supported) { +pr_err ("failed: event '%s' not supported\n" , + perf_mem_events[j].name); +return -1 ; + } + rec_argv[i++] ="-e" ; rec_argv[i++] = perf_mem_events[j].name; };@@ -355,6 +362,11 @@ int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused) NULL }; +if (perf_mem_events__init ()) { +pr_err ("failed: memory events not supported\n" ); +return -1 ; + } + argc =parse_options_subcommand (argc, argv, mem_options, mem_subcommands, mem_usage,PARSE_OPT_STOP_AT_NON_OPTION );tools/perf/util/mem-events.c +32
-3@@ -2,15 +2,20 @@#include <stdlib.h> #include <string.h> #include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <api/fs/fs.h> #include "mem-events.h" #include "debug.h" -#define E (t, n) { .tag = t, .name = n } +#define E (t, n, s) { .tag = t, .name = n, .sysfs_name = s }struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ] = { -E ("ldlat-loads" ,"cpu/mem-loads,ldlat=30/P" ), -E ("ldlat-stores" ,"cpu/mem-stores/P" ), +E ("ldlat-loads" ,"cpu/mem-loads,ldlat=30/P" ,"mem-loads" ), +E ("ldlat-stores" ,"cpu/mem-stores/P" ,"mem-stores" ), }; +#undef E#undef E@@ -49,3 +54,27 @@ int perf_mem_events__parse(const char *str)pr_err ("failed: event '%s' not found, use '-e list' to get list of available events\n" , str);return -1 ; } + +int perf_mem_events__init (void ) +{ +const char *mnt =sysfs__mount (); +bool found = false; +int j; + +if (!mnt) +return -ENOENT ; + +for (j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) { +char path[PATH_MAX ]; +struct perf_mem_event *e = &perf_mem_events[j]; +struct stat st; + +scnprintf (path,PATH_MAX ,"%s/devices/cpu/events/%s" , + mnt, e->sysfs_name); + +if (!stat (path, &st)) + e->supported = found = true; + } + +return found ?0 : -ENOENT ; +}tools/perf/util/mem-events.h +3
-0@@ -5,8 +5,10 @@struct perf_mem_event {bool record; +bool supported;const char *tag;const char *name; +const char *sysfs_name; };enum {@@ -18,6 +20,7 @@ enum {extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ];int perf_mem_events__parse (const char *str); +int perf_mem_events__init (void );#endif /* __PERF_MEM_EVENTS_H */ Signature · 1 line
2.4.3
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 06/23] perf mem: Check for memory events support
Em Tue, Feb 23, 2016 at 12:18:14PM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 8 lines
Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Check if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list [ok] ldlat-loads [ok] ldlat-stores
Quoted 5 lines
Can't this be:
$ perf mem record -e list ldlat-loads: Available on this machine ldlat-stores: Available on this machine
Please check perf/core, I applied a good number of the patches in this series.
- Arnaldo
Re: [PATCH 06/23] perf mem: Check for memory events support
Quoted 9 lines · Arnaldo Carvalho de Melo
Em Tue, Feb 23, 2016 at 12:18:14PM -0300, Arnaldo Carvalho de Melo escreveu:
Quoted 8 lines
Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Check if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list [ok] ldlat-loads [ok] ldlat-stores
Quoted 8 lines
Quoted 5 lines
Can't this be:
$ perf mem record -e list ldlat-loads: Available on this machine ldlat-stores: Available on this machinePlease check perf/core, I applied a good number of the patches in this series.
great, I'll rebase the rest and make the change
for this one in next version
thanks,
jirka
Re: [PATCH 06/23] perf mem: Check for memory events support
In reply to Arnaldo Carvalho de MeloQuoted 8 lines · Arnaldo Carvalho de Melo
Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Check if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list [ok] ldlat-loads [ok] ldlat-stores
Quoted 5 lines
Can't this be:
$ perf mem record -e list ldlat-loads: Available on this machine ldlat-stores: Available on this machine
hum IMO that would be quite long list if DATALA events will get in, so I wanted something short and punchy ;-)
how about plaing it into back as you suggested
with just 'available'
$ perf mem record -e list ldlat-loads: available ldlat-stores: available
jirka
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 06/23] perf mem: Check for memory events support
Em Tue, Feb 23, 2016 at 04:29:57PM +0100, Jiri Olsa escreveu:
Quoted 18 lines · Arnaldo Carvalho de Melo
Quoted 8 lines
Em Mon, Feb 15, 2016 at 09:34:36AM +0100, Jiri Olsa escreveu:
Quoted 6 lines
Check if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list [ok] ldlat-loads [ok] ldlat-storesQuoted 5 lines
Can't this be:
$ perf mem record -e list ldlat-loads: Available on this machine ldlat-stores: Available on this machinehum IMO that would be quite long list if DATALA events will get in, so I wanted something short and punchy ;-)
Quoted 6 lines
how about plaing it into back as you suggested
with just 'available'$ perf mem record -e list ldlat-loads: available ldlat-stores: available
Fair enough, this is more in line with, say, 'perf test' output, i.e.:
$ perf foo something: status/result
- Arnaldo
Jiri Olsa
reviewerPATCH 7/23 perf mem: Introduce perf_mem_events__name function
In reply to Jiri OlsaWrap perf_mem_events[].name into perf_mem_events__name function so we could alter the events name if needed.
This will be handy when changing latency settings for loads event in following patch.
--- tools/perf/builtin-mem.c | 4 ++-- tools/perf/util/mem-events.c | 5 +++++ tools/perf/util/mem-events.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-)
tools/perf/builtin-mem.c +2 -2
@@ -95,12 +95,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)if (!perf_mem_events[j].supported) {pr_err ("failed: event '%s' not supported\n" , - perf_mem_events[j].name); +perf_mem_events__name (j));return -1 ; } rec_argv[i++] ="-e" ; - rec_argv[i++] = perf_mem_events[j].name; + rec_argv[i++] =perf_mem_events__name (j); };for (j =0 ; j < argc; j++, i++)
tools/perf/util/mem-events.c +5 -0
@@ -19,6 +19,11 @@ struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {#undef E +char *perf_mem_events__name (int i) +{ +return (char *) perf_mem_events[i].name; +} +int perf_mem_events__parse (const char *str) {char *tok, *saveptr =NULL ;
tools/perf/util/mem-events.h +1 -0
@@ -22,5 +22,6 @@ extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX];int perf_mem_events__parse (const char *str);int perf_mem_events__init (void ); +char *perf_mem_events__name (int i);#endif /* __PERF_MEM_EVENTS_H */
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 8/23 perf mem: Add -l/--ldlat option
In reply to Jiri OlsaAdding -l/--ldlat option to specify desired latency for loads event.
Specify 50 as loads event latency:
$ perf mem record -e ldlat-loads -v -l 50 true calling: record -W -d -e cpu/mem-loads,ldlat=50/P true
--- tools/perf/builtin-mem.c | 1 + tools/perf/util/mem-events.c | 17 ++++++++++++++++- tools/perf/util/mem-events.h | 1 + 3 files changed, 18 insertions(+), 1 deletion(-)
tools/perf/builtin-mem.c +1 -0
@@ -66,6 +66,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)OPT_CALLBACK ('e' ,"event" , &mem,"event" ,"event selector. use 'perf mem record -e list' to list available events" , parse_record_events), +OPT_UINTEGER ('l' ,"ldlat" , &perf_mem_events__loads_ldlat,"mem-loads latency" ),OPT_INCR ('v' ,"verbose" , &verbose,"be more verbose (show counter open errors, etc)" ),OPT_END ()
tools/perf/util/mem-events.c +16 -1
@@ -9,18 +9,33 @@#include "mem-events.h" #include "debug.h" +unsigned int perf_mem_events__loads_ldlat =30 ; +#define E (t, n, s) { .tag = t, .name = n, .sysfs_name = s }struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ] = { -E ("ldlat-loads" ,"cpu/mem-loads,ldlat=30/P" ,"mem-loads" ), +E ("ldlat-loads" ,"cpu/mem-loads,ldlat=%u/P" ,"mem-loads" ),E ("ldlat-stores" ,"cpu/mem-stores/P" ,"mem-stores" ), };#undef E#undef E +static char mem_loads_name[100 ]; +static bool mem_loads_name__init; +char *perf_mem_events__name (int i) { +if (i ==PERF_MEM_EVENTS__LOAD ) { +if (!mem_loads_name__init) { + mem_loads_name__init = true; +scnprintf (mem_loads_name,sizeof (mem_loads_name), + perf_mem_events[i].name, + perf_mem_events__loads_ldlat); + } +return mem_loads_name; + } +return (char *) perf_mem_events[i].name; }
tools/perf/util/mem-events.h +1 -0
@@ -18,6 +18,7 @@ enum { };extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ]; +extern unsigned int perf_mem_events__loads_ldlat;int perf_mem_events__parse (const char *str);int perf_mem_events__init (void );
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 9/23 perf mem: Add -u/-k options
In reply to Jiri OlsaAdd -u/-k (--all-user/--all-kernel) options to use the perf record --all-user/--all-kernel options.
--- tools/perf/builtin-mem.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
tools/perf/builtin-mem.c +10 -1
@@ -62,6 +62,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)int rec_argc, i =0 , j;const char **rec_argv;int ret; +bool all_user = false, all_kernel = false;struct option options[] = { OPT_CALLBACK('e', "event", &mem, "event", "event selector. use 'perf mem record -e list' to list available events",
@@ -69,13 +70,15 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)OPT_UINTEGER ('l' ,"ldlat" , &perf_mem_events__loads_ldlat,"mem-loads latency" ),OPT_INCR ('v' ,"verbose" , &verbose,"be more verbose (show counter open errors, etc)" ), +OPT_BOOLEAN ('u' ,"--all-user" , &all_user,"collect only user level data" ), +OPT_BOOLEAN ('k' ,"--all-kernel" , &all_kernel,"collect only kernel level data" ), OPT_END() }; argc =parse_options (argc, argv, options, record_mem_usage,PARSE_OPT_STOP_AT_NON_OPTION ); - rec_argc = argc +7 ;/* max number of arguments */ + rec_argc = argc +9 ;/* max number of arguments */ rec_argv =calloc (rec_argc +1 ,sizeof (char *));if (!rec_argv)return -1 ;
@@ -104,6 +107,12 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) rec_argv[i++] =perf_mem_events__name (j); }; +if (all_user) + rec_argv[i++] ="--all-user" ; + +if (all_kernel) + rec_argv[i++] ="--all-kernel" ; +for (j =0 ; j < argc; j++, i++) rec_argv[i] = argv[j];
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 10/23 perf x86 intel: Add DATALA events into sysfs
In reply to Jiri OlsaAdding DATALA events into Haaswell events sysfs
directory, so it's easier to use them.
Adding all DATALA events as specified by Intel SDM manual 18.10.3 PEBS Data Address Profiling.
--- arch/x86/kernel/cpu/perf_event_intel.c | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)
arch/x86/kernel/cpu/perf_event_intel.c +39 -0
@@ -3253,6 +3253,26 @@ static __init void intel_ht_bug(void)EVENT_ATTR_STR (mem-loads, mem_ld_hsw,"event=0xcd,umask=0x1,ldlat=3" ); EVENT_ATTR_STR(mem-stores, mem_st_hsw, "event=0xd0,umask=0x82") +EVENT_ATTR_STR (mem-stlb-miss-loads, hsw_stlb_miss_loads,"event=0xd0,umask=0x11" ); +EVENT_ATTR_STR (mem-stlb-miss-stores, hsw_stlb_miss_stores,"event=0xd0,umask=0x12" ); +EVENT_ATTR_STR (mem-lock-loads, hsw_lock_loads,"event=0xd0,umask=0x21" ); +EVENT_ATTR_STR (mem-split-loads, hsw_split_loads,"event=0xd0,umask=0x41" ); +EVENT_ATTR_STR (mem-split-stores, hsw_split_stores,"event=0xd0,umask=0x42" ); +EVENT_ATTR_STR (mem-all-loads, hsw_all_loads,"event=0xd0,umask=0x81" ); +EVENT_ATTR_STR (mem-all-stores, hsw_all_stores,"event=0xd0,umask=0x82" ); +EVENT_ATTR_STR (mem-load-l1-hit, hsw_load_l1_hit,"event=0xd1,umask=0x01" ); +EVENT_ATTR_STR (mem-load-l2-hit, hsw_load_l2_hit,"event=0xd1,umask=0x02" ); +EVENT_ATTR_STR (mem-load-l3-hit, hsw_load_l3_hit,"event=0xd1,umask=0x04" ); +EVENT_ATTR_STR (mem-load-l1-miss, hsw_load_l1_miss,"event=0xd1,umask=0x08" ); +EVENT_ATTR_STR (mem-load-l2-miss, hsw_load_l2_miss,"event=0xd1,umask=0x10" ); +EVENT_ATTR_STR (mem-load-l3-miss, hsw_load_l3_miss,"event=0xd1,umask=0x20" ); +EVENT_ATTR_STR (mem-load-hit-lfb, hsw_load_hit_lfb,"event=0xd1,umask=0x40" ); +EVENT_ATTR_STR (mem-snp-miss, hsw_snp_miss,"event=0xd2,umask=0x01" ); +EVENT_ATTR_STR (mem-snp-hit, hsw_snp_hit,"event=0xd2,umask=0x02" ); +EVENT_ATTR_STR (mem-snp-hitm, hsw_snp_hitm,"event=0xd2,umask=0x04" ); +EVENT_ATTR_STR (mem-snp-none, hsw_snp_none,"event=0xd2,umask=0x08" ); +EVENT_ATTR_STR (mem-local-dram, hsw_local_dram,"event=0xd3,umask=0x01" ); +/* Haswell special events */ EVENT_ATTR_STR (tx-start, tx_start,"event=0xc9,umask=0x1" );EVENT_ATTR_STR (tx-commit, tx_commit,"event=0xc9,umask=0x2" );
@@ -3282,6 +3302,25 @@ static struct attribute *hsw_events_attrs[] = {EVENT_PTR (cycles_ct),EVENT_PTR (mem_ld_hsw),EVENT_PTR (mem_st_hsw), +EVENT_PTR (hsw_stlb_miss_loads), +EVENT_PTR (hsw_stlb_miss_stores), +EVENT_PTR (hsw_lock_loads), +EVENT_PTR (hsw_split_loads), +EVENT_PTR (hsw_split_stores), +EVENT_PTR (hsw_all_loads), +EVENT_PTR (hsw_all_stores), +EVENT_PTR (hsw_load_l1_hit), +EVENT_PTR (hsw_load_l2_hit), +EVENT_PTR (hsw_load_l3_hit), +EVENT_PTR (hsw_load_l1_miss), +EVENT_PTR (hsw_load_l2_miss), +EVENT_PTR (hsw_load_l3_miss), +EVENT_PTR (hsw_load_hit_lfb), +EVENT_PTR (hsw_snp_miss), +EVENT_PTR (hsw_snp_hit), +EVENT_PTR (hsw_snp_hitm), +EVENT_PTR (hsw_snp_none), +EVENT_PTR (hsw_local_dram),NULL };
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 11/23 perf mem: Add Intel DATALA memory events
In reply to Jiri OlsaAdding Intel DATALA memory events into
perf mem record command:
$ perf mem record -e list
[ok] ldlat-loads
[ok] ldlat-stores
stlb-miss-loads
stlb-miss-stores
lock-loads
split-loads
split-stores
all-loads
all-stores
l1-hit
l2-hit
l3-hit
l1-miss
l2-miss
l3-miss
lfb
snp-miss
snp-hit
snp-hitm
snp-none
local-dramAll events from above lists are compiled in, but only those with [ok] are supported by kernel/HW. You need previous DATALA patch to support all of them.
--- tools/perf/util/mem-events.c | 19 +++++++++++++++++++ tools/perf/util/mem-events.h | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+)
tools/perf/util/mem-events.c +19 -0
@@ -16,6 +16,25 @@ unsigned int perf_mem_events__loads_ldlat = 30;struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ] = {E ("ldlat-loads" ,"cpu/mem-loads,ldlat=%u/P" ,"mem-loads" ),E ("ldlat-stores" ,"cpu/mem-stores/P" ,"mem-stores" ), +E ("stlb-miss-loads" ,"cpu/mem-stlb-miss-loads/P" ,"mem-stlb-miss-loads" ), +E ("stlb-miss-stores" ,"cpu/mem-stlb-miss-stores/P" ,"mem-stlb-miss-stores" ), +E ("lock-loads" ,"cpu/mem-lock-loads/P" ,"mem-lock-loads" ), +E ("split-loads" ,"cpu/mem-split-loads/P" ,"mem-split-loads" ), +E ("split-stores" ,"cpu/mem-split-stores/P" ,"mem-split-stores" ), +E ("all-loads" ,"cpu/mem-all-loads/P" ,"mem-all-loads" ), +E ("all-stores" ,"cpu/mem-all-stores/P" ,"mem-all-stores" ), +E ("l1-hit" ,"cpu/mem-load-l1-hit/P" ,"mem-load-l1-hit" ), +E ("l2-hit" ,"cpu/mem-load-l2-hit/P" ,"mem-load-l2-hit" ), +E ("l3-hit" ,"cpu/mem-load-l3-hit/P" ,"mem-load-l3-hit" ), +E ("l1-miss" ,"cpu/mem-load-l1-miss/P" ,"mem-load-l1-miss" ), +E ("l2-miss" ,"cpu/mem-load-l2-miss/P" ,"mem-load-l2-miss" ), +E ("l3-miss" ,"cpu/mem-load-l3-miss/P" ,"mem-load-l3-miss" ), +E ("lfb" ,"cpu/mem-load-hit-lfb/P" ,"mem-load-hit-lfb" ), +E ("snp-miss" ,"cpu/mem-snp-miss/P" ,"mem-snp-miss" ), +E ("snp-hit" ,"cpu/mem-snp-hit/P" ,"mem-snp-hit" ), +E ("snp-hitm" ,"cpu/mem-snp-hitm/P" ,"mem-snp-hitm" ), +E ("snp-none" ,"cpu/mem-snp-none/P" ,"mem-snp-none" ), +E ("local-dram" ,"cpu/mem-local-dram/P" ,"mem-local-dram" ), };#undef E
tools/perf/util/mem-events.h +19 -0
@@ -14,6 +14,25 @@ struct perf_mem_event {enum {PERF_MEM_EVENTS__LOAD ,PERF_MEM_EVENTS__STORE , +PERF_MEM_EVENTS__STLB_MISS_LOADS , +PERF_MEM_EVENTS__STLB_MISS_STORES , +PERF_MEM_EVENTS__LOCK_LOADS , +PERF_MEM_EVENTS__SPLIT_LOADS , +PERF_MEM_EVENTS__SPLIT_STORES , +PERF_MEM_EVENTS__ALL_LOADS , +PERF_MEM_EVENTS__ALL_STORES , +PERF_MEM_EVENTS__L1_HIT , +PERF_MEM_EVENTS__L2_HIT , +PERF_MEM_EVENTS__L3_HIT , +PERF_MEM_EVENTS__L1_MISS , +PERF_MEM_EVENTS__L2_MISS , +PERF_MEM_EVENTS__L3_MISS , +PERF_MEM_EVENTS__LFB , +PERF_MEM_EVENTS__SNP_MISS , +PERF_MEM_EVENTS__SNP_HIT , +PERF_MEM_EVENTS__SNP_HITM , +PERF_MEM_EVENTS__SNP_NONE , +PERF_MEM_EVENTS__LOCAL_DRAM ,PERF_MEM_EVENTS__MAX , };
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 12/23 perf tools: Use ARRAY_SIZE in mem sort display functions
In reply to Jiri OlsaThere's no need to define extra macros for that.
--- tools/perf/util/sort.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
tools/perf/util/sort.c +3 -6
@@ -843,7 +843,6 @@ static const char * const tlb_access[] = {"Walker" , "Fault", }; -#define NUM_TLB_ACCESS (sizeof(tlb_access)/sizeof(const char *))static int hist_entry__tlb_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width)
@@ -865,7 +864,7 @@ static int hist_entry__tlb_snprintf(struct hist_entry *he, char *bf,/* already taken care of */ m &= ~(PERF_MEM_TLB_HIT |PERF_MEM_TLB_MISS ); -for (i =0 ; m && i <NUM_TLB_ACCESS ; i++, m >>=1 ) { +for (i =0 ; m && i <ARRAY_SIZE (tlb_access); i++, m >>=1 ) {if (!(m &0x1 ))continue ;if (l) {
@@ -920,7 +919,6 @@ static const char * const mem_lvl[] = {"I/O" , "Uncached", }; -#define NUM_MEM_LVL (sizeof(mem_lvl)/sizeof(const char *))static int hist_entry__lvl_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width)
@@ -942,7 +940,7 @@ static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,/* already taken care of */ m &= ~(PERF_MEM_LVL_HIT |PERF_MEM_LVL_MISS ); -for (i =0 ; m && i <NUM_MEM_LVL ; i++, m >>=1 ) { +for (i =0 ; m && i <ARRAY_SIZE (mem_lvl); i++, m >>=1 ) {if (!(m &0x1 ))continue ;if (l) {
@@ -988,7 +986,6 @@ static const char * const snoop_access[] = {"Hit" , "HitM", }; -#define NUM_SNOOP_ACCESS (sizeof(snoop_access)/sizeof(const char *))static int hist_entry__snoop_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width)
@@ -1003,7 +1000,7 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,if (he->mem_info) m = he->mem_info->data_src.mem_snoop; -for (i =0 ; m && i <NUM_SNOOP_ACCESS ; i++, m >>=1 ) { +for (i =0 ; m && i <ARRAY_SIZE (snoop_access); i++, m >>=1 ) {if (!(m &0x1 ))continue ;if (l) {
Signature · 1 line
2.4.3
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Use ARRAY_SIZE in mem sort display functions
perf tools: Use ARRAY_SIZE in mem sort display functions
Commit-ID: b19a1b6a233ede3ffc379b49e3653d6ce80dd743 Gitweb: http://git.kernel.org/tip/b19a1b6a233ede3ffc379b49e3653d6ce80dd743 Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:42 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 23 Feb 2016 12:19:10 -0300
perf tools: Use ARRAY_SIZE in mem sort display functions
There's no need to define extra macros for that.
--- tools/perf/util/sort.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
tools/perf/util/sort.c +3 -6
@@ -838,7 +838,6 @@ static const char * const tlb_access[] = {"Walker" , "Fault", }; -#define NUM_TLB_ACCESS (sizeof(tlb_access)/sizeof(const char *))static int hist_entry__tlb_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width)
@@ -860,7 +859,7 @@ static int hist_entry__tlb_snprintf(struct hist_entry *he, char *bf,/* already taken care of */ m &= ~(PERF_MEM_TLB_HIT |PERF_MEM_TLB_MISS ); -for (i =0 ; m && i <NUM_TLB_ACCESS ; i++, m >>=1 ) { +for (i =0 ; m && i <ARRAY_SIZE (tlb_access); i++, m >>=1 ) {if (!(m &0x1 ))continue ;if (l) {
@@ -915,7 +914,6 @@ static const char * const mem_lvl[] = {"I/O" , "Uncached", }; -#define NUM_MEM_LVL (sizeof(mem_lvl)/sizeof(const char *))static int hist_entry__lvl_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width)
@@ -937,7 +935,7 @@ static int hist_entry__lvl_snprintf(struct hist_entry *he, char *bf,/* already taken care of */ m &= ~(PERF_MEM_LVL_HIT |PERF_MEM_LVL_MISS ); -for (i =0 ; m && i <NUM_MEM_LVL ; i++, m >>=1 ) { +for (i =0 ; m && i <ARRAY_SIZE (mem_lvl); i++, m >>=1 ) {if (!(m &0x1 ))continue ;if (l) {
@@ -983,7 +981,6 @@ static const char * const snoop_access[] = {"Hit" , "HitM", }; -#define NUM_SNOOP_ACCESS (sizeof(snoop_access)/sizeof(const char *))static int hist_entry__snoop_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width)
@@ -998,7 +995,7 @@ static int hist_entry__snoop_snprintf(struct hist_entry *he, char *bf,if (he->mem_info) m = he->mem_info->data_src.mem_snoop; -for (i =0 ; m && i <NUM_SNOOP_ACCESS ; i++, m >>=1 ) { +for (i =0 ; m && i <ARRAY_SIZE (snoop_access); i++, m >>=1 ) {if (!(m &0x1 ))continue ;if (l) {
Jiri Olsa
reviewerPATCH 13/23 perf tools: Introduce perf_mem__tlb_scnprintf function
In reply to Jiri OlsaMove meminfo's tlb display function into mem-events.c object, so it could be reused later from script code.
--- tools/perf/util/mem-events.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/mem-events.h | 3 +++ tools/perf/util/sort.c | 44 ++--------------------------------------- 3 files changed, 52 insertions(+), 42 deletions(-)
tools/perf/util/mem-events.c +47 -0
@@ -8,6 +8,7 @@#include <api/fs/fs.h> #include "mem-events.h" #include "debug.h" +#include "symbol.h" unsigned int perf_mem_events__loads_ldlat =30 ;
@@ -117,3 +118,49 @@ int perf_mem_events__init(void)return found ?0 : -ENOENT ; } + +static const char *const tlb_access[] = { +"N/A" , +"HIT" , +"MISS" , +"L1" , +"L2" , +"Walker" , +"Fault" , +}; + +void perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info) +{ +size_t l =0 , i; +u64 m =PERF_MEM_TLB_NA ; +u64 hit, miss; + + sz -=1 ;/* -1 for null termination */ + out[0 ] ='\0' ; + +if (mem_info) + m = mem_info->data_src.mem_dtlb; + + hit = m &PERF_MEM_TLB_HIT ; + miss = m &PERF_MEM_TLB_MISS ; + +/* already taken care of */ + m &= ~(PERF_MEM_TLB_HIT |PERF_MEM_TLB_MISS ); + +for (i =0 ; m && i <ARRAY_SIZE (tlb_access); i++, m >>=1 ) { +if (!(m &0x1 )) +continue ; +if (l) { +strcat (out," or " ); + l +=4 ; + } +strncat (out, tlb_access[i], sz - l); + l +=strlen (tlb_access[i]); + } +if (*out =='\0' ) +strcpy (out,"N/A" ); +if (hit) +strncat (out," hit" , sz - l); +if (miss) +strncat (out," miss" , sz - l); +}
tools/perf/util/mem-events.h +3 -0
@@ -43,5 +43,8 @@ int perf_mem_events__parse(const char *str);int perf_mem_events__init (void );char *perf_mem_events__name (int i); + +struct mem_info ; +void perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info);#endif /* __PERF_MEM_EVENTS_H */
tools/perf/util/sort.c +2 -42
61 lines not on this page · raw message
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 14/23 perf tools: Introduce perf_mem__lvl_scnprintf function
In reply to Jiri OlsaMove meminfo's lvl display function into mem-events.c object, so it could be reused later from script code.
--- tools/perf/util/mem-events.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/mem-events.h | 1 + tools/perf/util/sort.c | 50 +---------------------------------------- 3 files changed, 55 insertions(+), 49 deletions(-)
tools/perf/util/mem-events.c +53 -0
@@ -164,3 +164,56 @@ void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)if (miss)strncat (out," miss" , sz - l); } + +static const char *const mem_lvl[] = { +"N/A" , +"HIT" , +"MISS" , +"L1" , +"LFB" , +"L2" , +"L3" , +"Local RAM" , +"Remote RAM (1 hop)" , +"Remote RAM (2 hops)" , +"Remote Cache (1 hop)" , +"Remote Cache (2 hops)" , +"I/O" , +"Uncached" , +}; + +void perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info) +{ +size_t i, l =0 ; +u64 m =PERF_MEM_LVL_NA ; +u64 hit, miss; + +if (mem_info) + m = mem_info->data_src.mem_lvl; + + sz -=1 ;/* -1 for null termination */ + out[0 ] ='\0' ; + + hit = m &PERF_MEM_LVL_HIT ; + miss = m &PERF_MEM_LVL_MISS ; + +/* already taken care of */ + m &= ~(PERF_MEM_LVL_HIT |PERF_MEM_LVL_MISS ); + +for (i =0 ; m && i <ARRAY_SIZE (mem_lvl); i++, m >>=1 ) { +if (!(m &0x1 )) +continue ; +if (l) { +strcat (out," or " ); + l +=4 ; + } +strncat (out, mem_lvl[i], sz - l); + l +=strlen (mem_lvl[i]); + } +if (*out =='\0' ) +strcpy (out,"N/A" ); +if (hit) +strncat (out," hit" , sz - l); +if (miss) +strncat (out," miss" , sz - l); +}
tools/perf/util/mem-events.h +1 -0
@@ -46,5 +46,6 @@ char *perf_mem_events__name(int i);struct mem_info ;void perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +void perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info);#endif /* __PERF_MEM_EVENTS_H */
tools/perf/util/sort.c +1 -49
61 lines not on this page · raw message
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 15/23 perf tools: Introduce perf_mem__snp_scnprintf function
In reply to Jiri OlsaMove meminfo's snp display function into mem-events.c object, so it could be reused later from script code.
--- tools/perf/util/mem-events.c | 34 ++++++++++++++++++++++++++++++++++ tools/perf/util/mem-events.h | 1 + tools/perf/util/sort.c | 31 +------------------------------ 3 files changed, 36 insertions(+), 30 deletions(-)
tools/perf/util/mem-events.c +34 -0
@@ -217,3 +217,37 @@ void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)if (miss)strncat (out," miss" , sz - l); } + +static const char *const snoop_access[] = { +"N/A" , +"None" , +"Miss" , +"Hit" , +"HitM" , +}; + +void perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info) +{ +size_t i, l =0 ; +u64 m =PERF_MEM_SNOOP_NA ; + + sz -=1 ;/* -1 for null termination */ + out[0 ] ='\0' ; + +if (mem_info) + m = mem_info->data_src.mem_snoop; + +for (i =0 ; m && i <ARRAY_SIZE (snoop_access); i++, m >>=1 ) { +if (!(m &0x1 )) +continue ; +if (l) { +strcat (out," or " ); + l +=4 ; + } +strncat (out, snoop_access[i], sz - l); + l +=strlen (snoop_access[i]); + } + +if (*out =='\0' ) +strcpy (out,"N/A" ); +}
tools/perf/util/mem-events.h +1 -0
@@ -47,5 +47,6 @@ char *perf_mem_events__name(int i);struct mem_info ;void perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +void perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info);#endif /* __PERF_MEM_EVENTS_H */
tools/perf/util/sort.c +1 -30
@@ -891,41 +891,12 @@ sort__snoop_cmp(struct hist_entry *left, struct hist_entry *right)return (int64_t )(data_src_r.mem_snoop - data_src_l.mem_snoop); } -static const char *const snoop_access[] = { -"N/A" , -"None" , -"Miss" , -"Hit" , -"HitM" , -}; -static int hist_entry__snoop_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width) {char out[64 ]; -size_t sz =sizeof (out) -1 ;/* -1 for null termination */ -size_t i, l =0 ; -u64 m =PERF_MEM_SNOOP_NA ; - - out[0 ] ='\0' ; - -if (he->mem_info) - m = he->mem_info->data_src.mem_snoop; - -for (i =0 ; m && i <ARRAY_SIZE (snoop_access); i++, m >>=1 ) { -if (!(m &0x1 )) -continue ; -if (l) { -strcat (out," or " ); - l +=4 ; - } -strncat (out, snoop_access[i], sz - l); - l +=strlen (snoop_access[i]); - } - -if (*out =='\0' ) -strcpy (out,"N/A" ); +perf_mem__snp_scnprintf (out,sizeof (out), he->mem_info);return repsep_snprintf (bf, size,"%-*s" , width, out); }
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 16/23 perf tools: Introduce perf_mem__lck_scnprintf function
In reply to Jiri OlsaMove meminfo's lck display function into mem-events.c object, so it could be reused later from script code.
--- tools/perf/util/mem-events.c | 16 ++++++++++++++++ tools/perf/util/mem-events.h | 2 ++ tools/perf/util/sort.c | 14 ++------------ 3 files changed, 20 insertions(+), 12 deletions(-)
tools/perf/util/mem-events.c +16 -0
@@ -251,3 +251,19 @@ void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)if (*out =='\0' )strcpy (out,"N/A" ); } + +void perf_mem__lck_scnprintf (char *out,size_t sz__maybe_unused , +struct mem_info *mem_info) +{ +u64 mask =PERF_MEM_LOCK_NA ; + +if (mem_info) + mask = mem_info->data_src.mem_lock; + +if (mask &PERF_MEM_LOCK_NA ) +strncat (out,"N/A" ,3 ); +else if (mask &PERF_MEM_LOCK_LOCKED ) +strncat (out,"Yes" ,3 ); +else +strncat (out,"No" ,2 ); +}
tools/perf/util/mem-events.h +2 -0
@@ -48,5 +48,7 @@ struct mem_info;void perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +void perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +#endif /* __PERF_MEM_EVENTS_H */
tools/perf/util/sort.c +2 -12
@@ -800,19 +800,9 @@ sort__locked_cmp(struct hist_entry *left, struct hist_entry *right)static int hist_entry__locked_snprintf (struct hist_entry *he,char *bf,size_t size,unsigned int width) { -const char *out; -u64 mask =PERF_MEM_LOCK_NA ; - -if (he->mem_info) - mask = he->mem_info->data_src.mem_lock; - -if (mask &PERF_MEM_LOCK_NA ) - out ="N/A" ; -else if (mask &PERF_MEM_LOCK_LOCKED ) - out ="Yes" ; -else - out ="No" ; +char out[10 ]; +perf_mem__lck_scnprintf (out,sizeof (out), he->mem_info);return repsep_snprintf (bf, size,"%.*s" , width, out); }
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 17/23 perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
In reply to Jiri OlsaMoving strncat/strcpy calls into scnprintf to easily track number of displayed bytes. It will be used in following patch.
--- tools/perf/util/mem-events.c | 13 +++++++------ tools/perf/util/mem-events.h | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-)
tools/perf/util/mem-events.c +7 -6
@@ -129,7 +129,7 @@ static const char * const tlb_access[] = { "Fault", }; -void perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info) +int perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info) {size_t l =0 , i;u64 m =PERF_MEM_TLB_NA ;
@@ -154,15 +154,16 @@ void perf_mem__tlb_scnprintf(char *out, size_t sz, struct mem_info *mem_info)strcat (out," or " ); l +=4 ; } -strncat (out, tlb_access[i], sz - l); - l +=strlen (tlb_access[i]); + l +=scnprintf (out + l, sz - l, tlb_access[i]); }if (*out =='\0' ) -strcpy (out,"N/A" ); + l +=scnprintf (out, sz - l,"N/A" );if (hit) -strncat (out," hit" , sz - l); + l +=scnprintf (out + l, sz - l," hit" );if (miss) -strncat (out," miss" , sz - l); + l +=scnprintf (out + l, sz - l," miss" ); + +return l; }static const char *const mem_lvl[] = {
tools/perf/util/mem-events.h +1 -1
@@ -45,7 +45,7 @@ int perf_mem_events__init(void);char *perf_mem_events__name (int i);struct mem_info ; -void perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +int perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info);
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 18/23 perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
In reply to Jiri OlsaMoving strncat/strcpy calls into scnprintf to easily track number of displayed bytes. It will be used in following patch.
--- tools/perf/util/mem-events.c | 13 +++++++------ tools/perf/util/mem-events.h | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-)
tools/perf/util/mem-events.c +7 -6
@@ -183,7 +183,7 @@ static const char * const mem_lvl[] = { "Uncached", }; -void perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info) +int perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info) {size_t i, l =0 ;u64 m =PERF_MEM_LVL_NA ;
@@ -208,15 +208,16 @@ void perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info)strcat (out," or " ); l +=4 ; } -strncat (out, mem_lvl[i], sz - l); - l +=strlen (mem_lvl[i]); + l +=scnprintf (out + l, sz - l, mem_lvl[i]); }if (*out =='\0' ) -strcpy (out,"N/A" ); + l +=scnprintf (out, sz - l,"N/A" );if (hit) -strncat (out," hit" , sz - l); + l +=scnprintf (out + l, sz - l," hit" );if (miss) -strncat (out," miss" , sz - l); + l +=scnprintf (out + l, sz - l," miss" ); + +return l; }static const char *const snoop_access[] = {
tools/perf/util/mem-events.h +1 -1
@@ -46,7 +46,7 @@ char *perf_mem_events__name(int i);struct mem_info ;int perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info); -void perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +int perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info);
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 19/23 perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
In reply to Jiri OlsaMoving strncat/strcpy calls into scnprintf to easily track number of displayed bytes. It will be used in following patch.
--- tools/perf/util/mem-events.c | 9 +++++---- tools/perf/util/mem-events.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-)
tools/perf/util/mem-events.c +5 -4
@@ -228,7 +228,7 @@ static const char * const snoop_access[] = { "HitM", }; -void perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info) +int perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info) {size_t i, l =0 ;u64 m =PERF_MEM_SNOOP_NA ;
@@ -246,12 +246,13 @@ void perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)strcat (out," or " ); l +=4 ; } -strncat (out, snoop_access[i], sz - l); - l +=strlen (snoop_access[i]); + l +=scnprintf (out + l, sz - l, snoop_access[i]); }if (*out =='\0' ) -strcpy (out,"N/A" ); + l +=scnprintf (out, sz - l,"N/A" ); + +return l; } void perf_mem__lck_scnprintf(char *out, size_t sz __maybe_unused,
tools/perf/util/mem-events.h +1 -1
@@ -47,7 +47,7 @@ char *perf_mem_events__name(int i);struct mem_info ;int perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info);int perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info); -void perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +int perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info);void perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info);#endif /* __PERF_MEM_EVENTS_H */
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 20/23 perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
In reply to Jiri OlsaMoving strncat call into scnprintf to easily track number of displayed bytes. It will be used in following patch.
--- tools/perf/util/mem-events.c | 12 +++++++----- tools/perf/util/mem-events.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-)
tools/perf/util/mem-events.c +7 -5
@@ -255,18 +255,20 @@ int perf_mem__snp_scnprintf(char *out, size_t sz, struct mem_info *mem_info)return l; } -void perf_mem__lck_scnprintf (char *out,size_t sz__maybe_unused , -struct mem_info *mem_info) +int perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info) {u64 mask =PERF_MEM_LOCK_NA ; +int l;if (mem_info) mask = mem_info->data_src.mem_lock;if (mask &PERF_MEM_LOCK_NA ) -strncat (out,"N/A" ,3 ); + l =scnprintf (out, sz,"N/A" );else if (mask &PERF_MEM_LOCK_LOCKED ) -strncat (out,"Yes" ,3 ); + l =scnprintf (out, sz,"Yes" );else -strncat (out,"No" ,2 ); + l =scnprintf (out, sz,"No" ); + +return l; }
tools/perf/util/mem-events.h +1 -1
@@ -48,7 +48,7 @@ struct mem_info;int perf_mem__tlb_scnprintf (char *out,size_t sz,struct mem_info *mem_info);int perf_mem__lvl_scnprintf (char *out,size_t sz,struct mem_info *mem_info);int perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info); -void perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +int perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info);#endif /* __PERF_MEM_EVENTS_H */
Signature · 1 line
2.4.3
Jiri Olsa
reviewerPATCH 21/23 perf script: Add data_src and weight column definitions
In reply to Jiri OlsaAdding data_src and weight column definitions, so it's displayed for related sample types.
--- tools/perf/builtin-script.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
tools/perf/builtin-script.c +20 -0
@@ -58,6 +58,8 @@ enum perf_output_field {PERF_OUTPUT_IREGS =1U <<14 ,PERF_OUTPUT_BRSTACK =1U <<15 ,PERF_OUTPUT_BRSTACKSYM =1U <<16 , +PERF_OUTPUT_DATA_SRC =1U <<17 , + PERF_OUTPUT_WEIGHT = 1U << 18, }; struct output_option {
@@ -81,6 +83,8 @@ struct output_option { {.str = "iregs", .field = PERF_OUTPUT_IREGS}, {.str = "brstack", .field = PERF_OUTPUT_BRSTACK}, {.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM}, + {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC}, + {.str = "weight", .field = PERF_OUTPUT_WEIGHT}, };/* default set to maintain compatibility with current format */
@@ -242,6 +246,16 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel, PERF_OUTPUT_ADDR, allow_user_set))return -EINVAL ; +if (PRINT_FIELD (DATA_SRC ) && +perf_evsel__check_stype (evsel,PERF_SAMPLE_DATA_SRC ,"DATA_SRC" , +PERF_OUTPUT_DATA_SRC )) +return -EINVAL ; + +if (PRINT_FIELD (WEIGHT ) && +perf_evsel__check_stype (evsel,PERF_SAMPLE_WEIGHT ,"WEIGHT" , +PERF_OUTPUT_WEIGHT )) +return -EINVAL ; +if (PRINT_FIELD (SYM ) && !PRINT_FIELD (IP ) && !PRINT_FIELD (ADDR )) {pr_err ("Display of symbols requested but neither sample IP nor " "sample address\nis selected. Hence, no addresses to convert "
@@ -673,6 +687,12 @@ static void process_event(struct perf_script *script, union perf_event *event,if (PRINT_FIELD (ADDR ))print_sample_addr (event, sample, thread, attr); +if (PRINT_FIELD (DATA_SRC )) +printf ("%16" PRIx64, sample->data_src); + +if (PRINT_FIELD (WEIGHT )) +printf ("%16" PRIu64, sample->weight); +if (PRINT_FIELD (IP )) {if (!symbol_conf.use_callchain)printf (" " );
Signature · 1 line
2.4.3
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf script: Add data_src and weight column definitions
perf script: Add data_src and weight column definitions
Commit-ID: 94ddddfab521423d94d6066879b514b9431e5cae Gitweb: http://git.kernel.org/tip/94ddddfab521423d94d6066879b514b9431e5cae Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:51 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 23 Feb 2016 12:20:02 -0300
perf script: Add data_src and weight column definitions
Adding data_src and weight column definitions, so it's displayed for related sample types.
--- tools/perf/builtin-script.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
tools/perf/builtin-script.c +20 -0
@@ -58,6 +58,8 @@ enum perf_output_field {PERF_OUTPUT_IREGS =1U <<14 ,PERF_OUTPUT_BRSTACK =1U <<15 ,PERF_OUTPUT_BRSTACKSYM =1U <<16 , +PERF_OUTPUT_DATA_SRC =1U <<17 , + PERF_OUTPUT_WEIGHT = 1U << 18, }; struct output_option {
@@ -81,6 +83,8 @@ struct output_option { {.str = "iregs", .field = PERF_OUTPUT_IREGS}, {.str = "brstack", .field = PERF_OUTPUT_BRSTACK}, {.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM}, + {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC}, + {.str = "weight", .field = PERF_OUTPUT_WEIGHT}, };/* default set to maintain compatibility with current format */
@@ -242,6 +246,16 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel, PERF_OUTPUT_ADDR, allow_user_set))return -EINVAL ; +if (PRINT_FIELD (DATA_SRC ) && +perf_evsel__check_stype (evsel,PERF_SAMPLE_DATA_SRC ,"DATA_SRC" , +PERF_OUTPUT_DATA_SRC )) +return -EINVAL ; + +if (PRINT_FIELD (WEIGHT ) && +perf_evsel__check_stype (evsel,PERF_SAMPLE_WEIGHT ,"WEIGHT" , +PERF_OUTPUT_WEIGHT )) +return -EINVAL ; +if (PRINT_FIELD (SYM ) && !PRINT_FIELD (IP ) && !PRINT_FIELD (ADDR )) {pr_err ("Display of symbols requested but neither sample IP nor " "sample address\nis selected. Hence, no addresses to convert "
@@ -673,6 +687,12 @@ static void process_event(struct perf_script *script, union perf_event *event,if (PRINT_FIELD (ADDR ))print_sample_addr (event, sample, thread, attr); +if (PRINT_FIELD (DATA_SRC )) +printf ("%16" PRIx64, sample->data_src); + +if (PRINT_FIELD (WEIGHT )) +printf ("%16" PRIu64, sample->weight); +if (PRINT_FIELD (IP )) {if (!symbol_conf.use_callchain)printf (" " );
Jiri Olsa
reviewerPATCH 22/23 perf script: Display addr/data_src/weight columns for raw events
In reply to Jiri OlsaAdding addr/data_src/weight columns for raw events.
Example:
$ perf script ... true 11883 322960.489590: ... ffff8801aa0b8400 68501042 246 ffffffff813b2cd true 11883 322960.489600: ... ffff8800b90b38d8 68501042 251 ffffffff811d0b7 true 11883 322960.489612: ... ffff880196893130 6a100142 94 ffffffff8177fb8 true 11883 322960.489637: ... ffff880164277b40 68100842 101 ffffffff813b2cd true 11883 322960.489683: ... ffff880035d3d818 68501042 201 ffffffff811d0b7 true 11883 322960.489733: ... 7fb9616efcf0 68100242 199 7fb961aaba9 true 11883 322960.489818: ... ffffea000481c39c 6a100142 122 ffffffff811b634
^^^^^^^^^^^^^^^^ ^^^^^^^^ ^^^
addr data_src weight
--- tools/perf/builtin-script.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/builtin-script.c +2 -1
@@ -135,7 +135,8 @@ static struct {PERF_OUTPUT_CPU |PERF_OUTPUT_TIME |PERF_OUTPUT_EVNAME |PERF_OUTPUT_IP |PERF_OUTPUT_SYM |PERF_OUTPUT_DSO | - PERF_OUTPUT_PERIOD, +PERF_OUTPUT_PERIOD |PERF_OUTPUT_ADDR | + PERF_OUTPUT_DATA_SRC | PERF_OUTPUT_WEIGHT, .invalid_fields = PERF_OUTPUT_TRACE, },
Signature · 1 line
2.4.3
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf script: Display addr/data_src/weight columns for raw events
perf script: Display addr/data_src/weight columns for raw events
Commit-ID: ff7b191583c368612fde88bf3cff6e3f3b0d73d5 Gitweb: http://git.kernel.org/tip/ff7b191583c368612fde88bf3cff6e3f3b0d73d5 Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 15 Feb 2016 09:34:52 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 23 Feb 2016 12:20:21 -0300
perf script: Display addr/data_src/weight columns for raw events
Adding addr/data_src/weight columns for raw events.
Example:
$ perf script ... true 11883 322960.489590: ... ffff8801aa0b8400 68501042 246 ffffffff813b2cd true 11883 322960.489600: ... ffff8800b90b38d8 68501042 251 ffffffff811d0b7 true 11883 322960.489612: ... ffff880196893130 6a100142 94 ffffffff8177fb8 true 11883 322960.489637: ... ffff880164277b40 68100842 101 ffffffff813b2cd true 11883 322960.489683: ... ffff880035d3d818 68501042 201 ffffffff811d0b7 true 11883 322960.489733: ... 7fb9616efcf0 68100242 199 7fb961aaba9 true 11883 322960.489818: ... ffffea000481c39c 6a100142 122 ffffffff811b634
^^^^^^^^^^^^^^^^ ^^^^^^^^ ^^^
addr data_src weight
--- tools/perf/builtin-script.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/builtin-script.c +2 -1
@@ -135,7 +135,8 @@ static struct {PERF_OUTPUT_CPU |PERF_OUTPUT_TIME |PERF_OUTPUT_EVNAME |PERF_OUTPUT_IP |PERF_OUTPUT_SYM |PERF_OUTPUT_DSO | - PERF_OUTPUT_PERIOD, +PERF_OUTPUT_PERIOD |PERF_OUTPUT_ADDR | + PERF_OUTPUT_DATA_SRC | PERF_OUTPUT_WEIGHT, .invalid_fields = PERF_OUTPUT_TRACE, },
Jiri Olsa
reviewerPATCH 23/23 perf script: Display data_src values
In reply to Jiri OlsaAdding support to display data_src values,
for events with data_src data in sample.
Example:
$ perf script
...
rcuos/3 32 [002] ... 68501042 Local RAM hit|SNP None or Hit|TLB L1 or L2 hit|LCK No ...
rcuos/3 32 [002] ... 68100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK No ...
swapper 0 [002] ... 68100242 LFB hit|SNP None|TLB L1 or L2 hit|LCK No ...
swapper 0 [000] ... 68100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK No ...
swapper 0 [000] ... 50100142 L1 hit|SNP None|TLB L2 miss|LCK No ...
rcuos/3 32 [002] ... 68100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK No ...
plugin-containe 16538 [000] ... 6a100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK Yes ...
gkrellm 1736 [000] ... 68100242 LFB hit|SNP None|TLB L1 or L2 hit|LCK No ...
gkrellm 1736 [000] ... 6a100142 L1 hit|SNP None|TLB L1 or L2 hit|LCK Yes ... ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
data_src value data_src translation
--- tools/perf/builtin-script.c | 20 +++++++++++++++++++- tools/perf/util/mem-events.c | 15 +++++++++++++++ tools/perf/util/mem-events.h | 2 ++ 3 files changed, 36 insertions(+), 1 deletion(-)
tools/perf/builtin-script.c +19 -1
@@ -23,6 +23,7 @@#include "util/stat.h" #include <linux/bitmap.h> #include "asm/bug.h" +#include "util/mem-events.h" static char const *script_name;static char const *generate_script_lang;
@@ -649,6 +650,23 @@ static int perf_evlist__max_name_len(struct perf_evlist *evlist)return max; } +static size_t data_src__printf (u64 data_src) +{ +struct mem_info mi = { .data_src.val = data_src }; +char decode[100 ]; +char out[100 ]; +static int maxlen; +int len; + +perf_script__meminfo_scnprintf (decode,100 , &mi); + + len =scnprintf (out,100 ,"%16" PRIx64" %s" , data_src, decode); +if (maxlen < len) + maxlen = len; + +return printf ("%-*s" , maxlen, out); +} +static void process_event (struct perf_script *script,union perf_event *event,struct perf_sample *sample,struct perf_evsel *evsel,struct addr_location *al)
@@ -689,7 +707,7 @@ static void process_event(struct perf_script *script, union perf_event *event,print_sample_addr (event, sample, thread, attr);if (PRINT_FIELD (DATA_SRC )) -printf ("%16" PRIx64, sample->data_src); +data_src__printf (sample->data_src);if (PRINT_FIELD (WEIGHT ))printf ("%16" PRIu64, sample->weight);
tools/perf/util/mem-events.c +15 -0
@@ -272,3 +272,18 @@ int perf_mem__lck_scnprintf(char *out, size_t sz, struct mem_info *mem_info)return l; } + +int perf_script__meminfo_scnprintf (char *out,size_t sz,struct mem_info *mem_info) +{ +int i =0 ; + + i +=perf_mem__lvl_scnprintf (out, sz, mem_info); + i +=scnprintf (out + i, sz - i,"|SNP " ); + i +=perf_mem__snp_scnprintf (out + i, sz - i, mem_info); + i +=scnprintf (out + i, sz - i,"|TLB " ); + i +=perf_mem__tlb_scnprintf (out + i, sz - i, mem_info); + i +=scnprintf (out + i, sz - i,"|LCK " ); + i +=perf_mem__lck_scnprintf (out + i, sz - i, mem_info); + +return i; +}
tools/perf/util/mem-events.h +2 -0
@@ -50,5 +50,7 @@ int perf_mem__lvl_scnprintf(char *out, size_t sz, struct mem_info *mem_info);int perf_mem__snp_scnprintf (char *out,size_t sz,struct mem_info *mem_info);int perf_mem__lck_scnprintf (char *out,size_t sz,struct mem_info *mem_info); +int perf_script__meminfo_scnprintf (char *bf,size_t size,struct mem_info *mem_info); +#endif /* __PERF_MEM_EVENTS_H */
Signature · 1 line
2.4.3