perf tools: Several memory events updates
Subsystems (2)
Jiri Olsa
reviewerv2 cover 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
v2 changes:
- changed the output of perf mem record -e list [Arnaldo]
- rebased, some of the patches got already pulled in
Also available in here:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
perf/mem
thanks,
jirka
---
Jiri Olsa (15):
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 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: Display data_src values
perf x86 intel: Add DATALA events into sysfs
perf mem: Add Intel DATALA memory events
arch/x86/events/intel/core.c | 39 ++++++++++++++++++++ tools/perf/builtin-mem.c | 34 ++++++++++++++--- tools/perf/builtin-script.c | 20 +++++++++- tools/perf/util/mem-events.c | 244 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- tools/perf/util/mem-events.h | 33 +++++++++++++++++ tools/perf/util/sort.c | 139 +++------------------------------------------------------------------ 6 files changed, 366 insertions(+), 143 deletions(-)
Jiri Olsa
reviewerPATCH v2 1/15 perf mem: Check for memory events support
Check if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list ldlat-loads : available ldlat-stores : available
--- tools/perf/builtin-mem.c | 20 ++++++++++++++++---- tools/perf/util/mem-events.c | 35 ++++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.h | 3 +++ 3 files changed, 51 insertions(+), 7 deletions(-)
tools/perf/builtin-mem.c +16 -4
@@ -40,10 +40,11 @@ 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" , - e->tag, verbose ?"" :"\n" ); -if (verbose) -fprintf (stderr," [%s]\n" , e->name); +fprintf (stderr,"%-13s%-*s%s\n" , + e->tag, + verbose ?25 :0 , + verbose ? e->name :"" , + e->supported ?": available" :"" ); }exit (0 ); }
@@ -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,5 +20,6 @@ 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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf mem record: Check for memory events support
perf mem record: Check for memory events support
Commit-ID: 54fbad54ebcde9db9c7459e9e379f2350c25e1f1 Gitweb: http://git.kernel.org/tip/54fbad54ebcde9db9c7459e9e379f2350c25e1f1 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:42 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:10:59 -0300
perf mem record: Check for memory events support
Check if current kernel support available memory events and display the status within -e list option:
$ perf mem record -e list ldlat-loads : available ldlat-stores : available
--- tools/perf/builtin-mem.c | 20 ++++++++++++++++---- tools/perf/util/mem-events.c | 35 ++++++++++++++++++++++++++++++++--- tools/perf/util/mem-events.h | 3 +++ 3 files changed, 51 insertions(+), 7 deletions(-)
tools/perf/builtin-mem.c +16 -4
@@ -40,10 +40,11 @@ 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" , - e->tag, verbose ?"" :"\n" ); -if (verbose) -fprintf (stderr," [%s]\n" , e->name); +fprintf (stderr,"%-13s%-*s%s\n" , + e->tag, + verbose ?25 :0 , + verbose ? e->name :"" , + e->supported ?": available" :"" ); }exit (0 ); }
@@ -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,5 +20,6 @@ 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 */
Jiri Olsa
reviewerPATCH v2 2/15 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 | 6 +++--- tools/perf/util/mem-events.c | 5 +++++ tools/perf/util/mem-events.h | 1 + 3 files changed, 9 insertions(+), 3 deletions(-)
tools/perf/builtin-mem.c +3 -3
@@ -43,7 +43,7 @@ static int parse_record_events(const struct option *opt,fprintf (stderr,"%-13s%-*s%s\n" , e->tag, verbose ?25 :0 , - verbose ? e->name :"" , + verbose ?perf_mem_events__name (j) :"" , e->supported ?": available" :"" ); }exit (0 );
@@ -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,4 +22,5 @@ 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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf mem: Introduce perf_mem_events__name function
perf mem: Introduce perf_mem_events__name function
Commit-ID: 2ba7ac5814a6952aad647ce31696b893772cbe83 Gitweb: http://git.kernel.org/tip/2ba7ac5814a6952aad647ce31696b893772cbe83 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:43 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:11:52 -0300
perf mem: Introduce perf_mem_events__name function
Wrap perf_mem_events[].name into perf_mem_events__name() 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 | 6 +++--- tools/perf/util/mem-events.c | 5 +++++ tools/perf/util/mem-events.h | 1 + 3 files changed, 9 insertions(+), 3 deletions(-)
tools/perf/builtin-mem.c +3 -3
@@ -43,7 +43,7 @@ static int parse_record_events(const struct option *opt,fprintf (stderr,"%-13s%-*s%s\n" , e->tag, verbose ?25 :0 , - verbose ? e->name :"" , + verbose ?perf_mem_events__name (j) :"" , e->supported ?": available" :"" ); }exit (0 );
@@ -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,4 +22,5 @@ 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 */
Jiri Olsa
reviewerPATCH v2 3/15 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
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 03/15] perf mem: Add -l/--ldlat option
Em Wed, Feb 24, 2016 at 09:46:44AM +0100, Jiri Olsa escreveu:
Quoted 7 lines
Adding -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
Please update the docs, also I think it is ok to leave it just as --ldlat, not using the one letter -l, we can do that if this becomes that frequently used.
- Arnaldo
Quoted 73 lines
Signed-off-by Jiri Olsa <[email protected]>--- 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
Re: [PATCH 03/15] perf mem: Add -l/--ldlat option
Quoted 4 lines · Arnaldo Carvalho de Melo
Em Wed, Feb 24, 2016 at 09:46:44AM +0100, Jiri Olsa escreveu:
Quoted 3 lines
Adding -l/--ldlat option to specify desired latency for loads event.
Quoted 8 lines
Quoted 4 lines
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 truePlease update the docs, also I think it is ok to leave it just as --ldlat, not using the one letter -l, we can do that if this becomes that frequently used.
ook, will do
thanks,
jirka
Jiri Olsa
reviewerPATCH v2 4/15 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
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 04/15] perf mem: Add -u/-k options
Em Wed, Feb 24, 2016 at 09:46:45AM +0100, Jiri Olsa escreveu:
Quoted 2 lines
Add -u/-k (--all-user/--all-kernel) options to use the perf record --all-user/--all-kernel options.
Missing documentation update. -u/-k usage is ok, should be the same accross all tools, have to check that... Actually make that -U and -K, 'perf top' needs fixing in making -U mean --hide_kernel_symbols , will do.
- Arnaldo
Quoted 50 lines
Signed-off-by Jiri Olsa <[email protected]>--- 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
Re: [PATCH 04/15] perf mem: Add -u/-k options
Quoted 7 lines · Arnaldo Carvalho de Melo
Em Wed, Feb 24, 2016 at 09:46:45AM +0100, Jiri Olsa escreveu:
Quoted 2 lines
Add -u/-k (--all-user/--all-kernel) options to use the perf record --all-user/--all-kernel options.
Missing documentation update. -u/-k usage is ok, should be the same accross all tools, have to check that... Actually make that -U and -K, 'perf top' needs fixing in making -U mean --hide_kernel_symbols , will do.
ok, so doc update and switch it into -U and -K
thanks,
jirka
Jiri Olsa
reviewerPATCH v2 5/15 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 ;
@@ -98,3 +99,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
@@ -24,4 +24,7 @@ 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
Re: [PATCH 05/15] perf tools: Introduce perf_mem__tlb_scnprintf function
Em Wed, Feb 24, 2016 at 09:46:46AM +0100, Jiri Olsa escreveu:
Quoted 10 lines
Move meminfo's tlb display function into
mem-events.cobject, so it could be reused later from script code.Signed-off-by Jiri Olsa <[email protected]>--- 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(-)
Applied, with minimal adjusts due to other patch not being applied.
- Arnaldo
Quoted 143 lines
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 ;@@ -98,3 +99,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@@ -24,4 +24,7 @@ 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@@ -6,6 +6,7 @@#include "evsel.h" #include "evlist.h" #include <traceevent/event-parse.h> +#include "mem-events.h" regex_t parent_regex;const char default_parent_pattern[] ="^sys_|^do_page_fault" ;@@ -829,53 +830,12 @@ sort__tlb_cmp(struct hist_entry *left, struct hist_entry *right)return (int64_t )(data_src_r.mem_dtlb - data_src_l.mem_dtlb); } -static const char *const tlb_access[] = { -"N/A" , -"HIT" , -"MISS" , -"L1" , -"L2" , -"Walker" , -"Fault" , -}; -static int hist_entry__tlb_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 l =0 , i; -u64 m =PERF_MEM_TLB_NA ; -u64 hit, miss; - - out[0 ] ='\0' ; - -if (he->mem_info) - m = he->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); +perf_mem__tlb_scnprintf (out,sizeof (out), he->mem_info);return repsep_snprintf (bf, size,"%-*s" , width, out); }Signature · 1 line
2.4.3
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Introduce perf_mem__tlb_scnprintf function
In reply to Jiri Olsaperf tools: Introduce perf_mem__tlb_scnprintf function
Commit-ID: 0c877d759d3a62a01d75dc6de4a923a686bb285a Gitweb: http://git.kernel.org/tip/0c877d759d3a62a01d75dc6de4a923a686bb285a Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:46 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:20:08 -0300
perf tools: Introduce perf_mem__tlb_scnprintf function
Move 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" #define E (t, n, s) { .tag = t, .name = n, .sysfs_name = s }
@@ -83,3 +84,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
@@ -23,4 +23,7 @@ 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
Jiri Olsa
reviewerPATCH v2 6/15 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
@@ -145,3 +145,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
@@ -27,4 +27,5 @@ 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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Introduce perf_mem__lvl_scnprintf function
perf tools: Introduce perf_mem__lvl_scnprintf function
Commit-ID: 071e9a1e12dceaec6f9d3ffe6e77ee68364166d6 Gitweb: http://git.kernel.org/tip/071e9a1e12dceaec6f9d3ffe6e77ee68364166d6 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:47 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:20:28 -0300
perf tools: Introduce perf_mem__lvl_scnprintf function
Move 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
@@ -130,3 +130,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
@@ -26,4 +26,5 @@ 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
Jiri Olsa
reviewerPATCH v2 7/15 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
@@ -198,3 +198,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
@@ -28,4 +28,5 @@ 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
@@ -886,41 +886,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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Introduce perf_mem__snp_scnprintf function
perf tools: Introduce perf_mem__snp_scnprintf function
Commit-ID: 2c07af13dcd4d971578041b50598f1269b33e68a Gitweb: http://git.kernel.org/tip/2c07af13dcd4d971578041b50598f1269b33e68a Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:48 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:20:45 -0300
perf tools: Introduce perf_mem__snp_scnprintf function
Move 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
@@ -183,3 +183,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
@@ -27,4 +27,5 @@ 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
@@ -886,41 +886,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); }
Jiri Olsa
reviewerPATCH v2 8/15 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
@@ -232,3 +232,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
@@ -29,4 +29,6 @@ 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
@@ -795,19 +795,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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Introduce perf_mem__lck_scnprintf function
perf tools: Introduce perf_mem__lck_scnprintf function
Commit-ID: 69a77275926ccd0c08fde103de52b59f18370f5a Gitweb: http://git.kernel.org/tip/69a77275926ccd0c08fde103de52b59f18370f5a Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:49 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:29:52 -0300
perf tools: Introduce perf_mem__lck_scnprintf function
Move 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
@@ -217,3 +217,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
@@ -28,4 +28,6 @@ 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
@@ -795,19 +795,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); }
Jiri Olsa
reviewerPATCH v2 9/15 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
@@ -110,7 +110,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 ;
@@ -135,15 +135,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
@@ -26,7 +26,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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
Commit-ID: b1a5fbea3d69511e445b8d9efe6dc605edb508c8 Gitweb: http://git.kernel.org/tip/b1a5fbea3d69511e445b8d9efe6dc605edb508c8 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:50 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:30:03 -0300
perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes
Moving 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
@@ -95,7 +95,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 ;
@@ -120,15 +120,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
@@ -25,7 +25,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);
Jiri Olsa
reviewerPATCH v2 10/15 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
@@ -164,7 +164,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 ;
@@ -189,15 +189,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
@@ -27,7 +27,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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
Commit-ID: 969075630e3abd1c740ac4f3183949cbf54b410d Gitweb: http://git.kernel.org/tip/969075630e3abd1c740ac4f3183949cbf54b410d Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:51 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:30:14 -0300
perf tools: Change perf_mem__lvl_scnprintf to return nb of displayed bytes
Moving 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
@@ -149,7 +149,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 ;
@@ -174,15 +174,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
@@ -26,7 +26,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);
Jiri Olsa
reviewerPATCH v2 11/15 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
@@ -209,7 +209,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 ;
@@ -227,12 +227,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
@@ -28,7 +28,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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
Commit-ID: 149d75076778d3b14e13b79d683b4f4fdd4fdb01 Gitweb: http://git.kernel.org/tip/149d75076778d3b14e13b79d683b4f4fdd4fdb01 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:52 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:30:22 -0300
perf tools: Change perf_mem__snp_scnprintf to return nb of displayed bytes
Moving 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
@@ -194,7 +194,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 ;
@@ -212,12 +212,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
@@ -27,7 +27,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 */
Jiri Olsa
reviewerPATCH v2 12/15 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
@@ -236,18 +236,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
@@ -29,6 +29,6 @@ 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
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
Commit-ID: 8b0819c8a3c97279b815581b606407c0387cc26f Gitweb: http://git.kernel.org/tip/8b0819c8a3c97279b815581b606407c0387cc26f Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:53 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:31:03 -0300
perf tools: Change perf_mem__lck_scnprintf to return nb of displayed bytes
Moving 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
@@ -221,18 +221,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
@@ -28,6 +28,6 @@ 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 */
Jiri Olsa
reviewerPATCH v2 13/15 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
@@ -253,3 +253,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
@@ -31,4 +31,6 @@ 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
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 13/15] perf script: Display data_src values
Em Wed, Feb 24, 2016 at 09:46:54AM +0100, Jiri Olsa escreveu:
Quoted 2 lines
Adding support to display
data_srcvalues,
for events withdata_srcdata in sample.
While testing patches in this series I noticed this:
[root@jouet ~]# perf mem record -a
Error: unknown switch `a'
Usage: perf mem record [<options>] [<command>]
or: perf mem record [<options>] -- <command> [<options>]
-e, --event <event> event selector. use 'perf mem record -e list' to list available events
-v, --verbose be more verbose (show counter open errors, etc)
[root@jouet ~]# perf mem record -- -a
^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 3.149 MB perf.data (173 samples) ]
[root@jouet ~]#
Can't we imply the -- after 'record', i.e pass everything after 'record' to the underlying 'perf record' call?
- Arnaldo
Re: [PATCH 13/15] perf script: Display data_src values
Quoted 19 lines · Arnaldo Carvalho de Melo
Em Wed, Feb 24, 2016 at 09:46:54AM +0100, Jiri Olsa escreveu:
Quoted 2 lines
Adding support to display
data_srcvalues,
for events withdata_srcdata in sample.While testing patches in this series I noticed this:
[root@jouet ~]# perf mem record -a
Error: unknown switch `a'Usage: perf mem record [<options>] [<command>]
or: perf mem record [<options>] -- <command> [<options>]-e, --event <event> event selector. use 'perf mem record -e list' to list available events
-v, --verbose be more verbose (show counter open errors, etc)[root@jouet ~]# perf mem record -- -a
^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 3.149 MB perf.data (173 samples) ]
Quoted 6 lines
[root@jouet ~]#
Can't we imply the -- after 'record', i.e pass everything after 'record' to the underlying 'perf record' call?
I'll check on that, and try to have it in next version
jirka
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf script: Display data_src values
In reply to Jiri Olsaperf script: Display data_src values
Commit-ID: c19ac91245a2f8d26aafd7f23256f3b76314d5d4 Gitweb: http://git.kernel.org/tip/c19ac91245a2f8d26aafd7f23256f3b76314d5d4 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 24 Feb 2016 09:46:54 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 24 Feb 2016 10:32:11 -0300
perf script: Display data_src values
Adding 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
@@ -238,3 +238,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
@@ -30,4 +30,6 @@ 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 */
Jiri Olsa
reviewerPATCH v2 14/15 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/events/intel/core.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)
arch/x86/events/intel/core.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
Re: [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs
Quoted 17 lines · Jiri Olsa
Adding 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.
Signed-off-by Jiri Olsa <[email protected]>--- arch/x86/events/intel/core.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)arch/x86/events/intel/core.c +0
-0
arch/x86/events/intel/core.c static __init void intel_ht_bug(void) · line 3260
Quoted 8 lines
arch/x86/events/intel/core.c +5
-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-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" );
I don't think these are well enough defined for generic events. For example what does hit-lfb mean generally? Snooping is also a fairly nebulous concept that can change between micro architectures.
Instead of adding more and more badly defined and not really portable generic events I think it would be better to apply the patches that enable the full Intel/POWER/other JSON event lists.
They have been posted multiple times by Sukadev and just need to be reviewed, and would be a far better solution to this.
That would also make them "easy to use".
This would have the advantage that we actually have documentation what they actually mean in the SDM, and they map to the documentation, and people can understand them without needing to reverse engineer perf.
Also these events can have bugs (see e.g. the Haswell Server spec updates) and if you can't look them up it can be hard to use.
-Andi
Re: [PATCH 14/15] perf x86 intel: Add DATALA events into sysfs
Quoted 40 lines · Andi Kleen
Quoted 17 lines · Jiri Olsa
Adding 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.
Signed-off-by Jiri Olsa <[email protected]>--- arch/x86/events/intel/core.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)arch/x86/events/intel/core.c +0
-0arch/x86/events/intel/core.c static __init void intel_ht_bug(void) · line 3260
Quoted 8 lines
arch/x86/events/intel/core.c +5
-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-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" );I don't think these are well enough defined for generic events. For example what does hit-lfb mean generally? Snooping is also a fairly nebulous concept that can change between micro architectures.
Instead of adding more and more badly defined and not really portable generic events I think it would be better to apply the patches that enable the full Intel/POWER/other JSON event lists.
They have been posted multiple times by Sukadev and just need to be reviewed, and would be a far better solution to this.
That would also make them "easy to use".
Quoted 7 lines
This would have the advantage that we actually have documentation what they actually mean in the SDM, and they map to the documentation, and people can understand them without needing to reverse engineer perf.
Also these events can have bugs (see e.g. the Haswell Server spec updates) and if you can't look them up it can be hard to use.
right, I'll keep that only in my queue.. we discussed with Peter and he said he'll try to check on JSON patchset state ;-)
thanks,
jirka
Jiri Olsa
reviewerPATCH v2 15/15 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 ldlat-loads : available ldlat-stores : available 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-dram
All 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/builtin-mem.c | 4 ++-- tools/perf/util/mem-events.c | 19 +++++++++++++++++++ tools/perf/util/mem-events.h | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-)
tools/perf/builtin-mem.c +2 -2
@@ -40,9 +40,9 @@ 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,"%-13s%-*s%s\n" , +fprintf (stderr,"%-17s%-*s%s\n" , e->tag, - verbose ?25 :0 , + verbose ?27 :0 , verbose ?perf_mem_events__name (j) :"" , e->supported ?": available" :"" ); }
tools/perf/util/mem-events.c +19 -0
@@ -17,6 +17,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