perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit 31d50c551e30923b86a1b5b420920dd1927fa63b:
perf/x86/amd/uncore: Do not register a task ctx for uncore PMUs (2016-04-13 11:56:36 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-20160413
for you to fetch changes up to 59247e33ff494e3643cdff54b64bf72575052b76:
perf trace: Do not accept --no-syscalls together with -e (2016-04-13 10:11:52 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
User visible:
- Print callchains asked for events requested via 'perf trace --event' too:
(Arnaldo Carvalho de Melo)
# trace -e nanosleep --call dwarf --event sched:sched_switch/call-graph=fp/ usleep 1
0.346 (0.005 ms): usleep/24428 nanosleep(rqtp: 0x7fffa15a0540) ...
0.346 ( ): sched:sched_switch:usleep:24428 [120] S ==> swapper/3:0 [120])
__schedule+0xfe200402 ([kernel.kallsyms])
schedule+0xfe200035 ([kernel.kallsyms])
do_nanosleep+0xfe20006f ([kernel.kallsyms])
hrtimer_nanosleep+0xfe2000dc ([kernel.kallsyms])
sys_nanosleep+0xfe20007a ([kernel.kallsyms])
do_syscall_64+0xfe200062 ([kernel.kallsyms])
return_from_SYSCALL_64+0xfe200000 ([kernel.kallsyms])
__nanosleep+0xffff005b8d602010 (/usr/lib64/libc-2.22.so)
0.400 (0.059 ms): usleep/24428 ... [continued]: nanosleep()) = 0
__nanosleep+0x10 (/usr/lib64/libc-2.22.so)
usleep+0x34 (/usr/lib64/libc-2.22.so)
main+0x1eb (/usr/bin/usleep)
__libc_start_main+0xf0 (/usr/lib64/libc-2.22.so)
_start+0x29 (/usr/bin/usleep)- Allow requesting that some CPUs or PIDs be highlighted in 'perf sched map' (Jiri Olsa)
- Compact 'perf sched map' to show just CPUs with activity, improving the output in high core count systems (Jiri Olsa)
- Fix segfault with 'perf trace --no-syscalls -e syscall-names' by bailing out such request, doesn't make sense to ask for no syscalls and then specify which ones should be printed (Arnaldo Carvalho de Melo)
----------------------------------------------------------------
Arnaldo Carvalho de Melo (3):
perf trace: Support callchains for --event too perf evsel: Move some methods from session.[ch] to evsel.[ch] perf trace: Do not accept --no-syscalls together with -e
Jiri Olsa (8):
perf thread_map: Add has() method
perf cpu_map: Add has() method
perf sched: Add compact display option
perf sched: Use color_fprintf for output
perf thread_map: Make new_by_tid_str constructor public perf sched map: Color given pids
perf sched map: Color given cpus
perf sched map: Display only given cpus
tools/perf/Documentation/perf-sched.txt | 16 +++ tools/perf/builtin-sched.c | 198 ++++++++++++++++++++++++++++++-- tools/perf/builtin-script.c | 14 +-- tools/perf/builtin-trace.c | 48 +++++--- tools/perf/util/cpumap.c | 12 ++ tools/perf/util/cpumap.h | 2 + tools/perf/util/evsel.c | 131 +++++++++++++++++++++ tools/perf/util/evsel.h | 13 +++ tools/perf/util/session.c | 130 --------------------- tools/perf/util/session.h | 13 --- tools/perf/util/thread_map.c | 14 ++- tools/perf/util/thread_map.h | 3 + 12 files changed, 416 insertions(+), 178 deletions(-)
Arnaldo Carvalho de Melo
maintainerPATCH 1/11 perf trace: Support callchains for --event too
From: Arnaldo Carvalho de Melo <[email protected]>
We already were able to ask for callchains for a specific event:
# trace -e nanosleep --call dwarf --event sched:sched_switch/call-graph=fp/ usleep 1
This would enable tracing just the "nanosleep" syscall, with callchains at syscall exit and would ask the kernel for frame pointer callchains to be enabled for the "sched:sched_switch" tracepoint event, its just that we were not resolving the callchain and printing it in 'perf trace', do it:
# trace -e nanosleep --call dwarf --event sched:sched_switch/call-graph=fp/ usleep 1
0.425 ( 0.013 ms): usleep/6718 nanosleep(rqtp: 0x7ffcc1d16e20) ...
0.425 ( ): sched:sched_switch:usleep:6718 [120] S ==> swapper/2:0 [120])
__schedule+0xfe200402 ([kernel.kallsyms])
schedule+0xfe200035 ([kernel.kallsyms])
do_nanosleep+0xfe20006f ([kernel.kallsyms])
hrtimer_nanosleep+0xfe2000dc ([kernel.kallsyms])
sys_nanosleep+0xfe20007a ([kernel.kallsyms])
do_syscall_64+0xfe200062 ([kernel.kallsyms])
return_from_SYSCALL_64+0xfe200000 ([kernel.kallsyms])
__nanosleep+0xffff008b8cbe2010 (/usr/lib64/libc-2.22.so)
0.486 ( 0.073 ms): usleep/6718 ... [continued]: nanosleep()) = 0
__nanosleep+0x10 (/usr/lib64/libc-2.22.so)
usleep+0x34 (/usr/lib64/libc-2.22.so)
main+0x1eb (/usr/bin/usleep)
__libc_start_main+0xf0 (/usr/lib64/libc-2.22.so)
_start+0x29 (/usr/bin/usleep)
#Pretty compact, huh? DWARF callchains for raw_syscalls:sys_exit + frame pointer callchains for a tracepoint, if your hardware supports LBR, go wild with /call-graph=lbr/, guess the next step is to lift this from 'perf script':
-F, --fields <str> comma separated output fields prepend with 'type:'. Valid types: hw,sw,trace,raw.
Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,addr,symoff,period,iregs,brstack,brstacksym,flags
--- tools/perf/builtin-trace.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-)
tools/perf/builtin-trace.c +26 -15
@@ -2114,6 +2114,28 @@ out_put:return err; } +static int trace__fprintf_callchain (struct trace *trace,struct perf_evsel *evsel, +struct perf_sample *sample) +{ +struct addr_location al; +/* TODO: user-configurable print_opts */ +const unsigned int print_opts =PRINT_IP_OPT_SYM | +PRINT_IP_OPT_DSO | +PRINT_IP_OPT_UNKNOWN_AS_ADDR ; + +if (sample->callchain ==NULL ) +return 0 ; + +if (machine__resolve (trace->host, &al, sample) <0 ) { +pr_err ("Problem processing %s callchain, skipping...\n" , +perf_evsel__name (evsel)); +return 0 ; + } + +return perf_evsel__fprintf_callchain (evsel, sample, &al,38 , print_opts, + scripting_max_stack, trace->output); +} +static int trace__sys_exit (struct trace *trace,struct perf_evsel *evsel,union perf_event *event__maybe_unused ,struct perf_sample *sample)
@@ -2193,21 +2215,7 @@ signed_print:fputc ('\n' , trace->output); -if (sample->callchain) { -struct addr_location al; -/* TODO: user-configurable print_opts */ -const unsigned int print_opts =PRINT_IP_OPT_SYM | -PRINT_IP_OPT_DSO | -PRINT_IP_OPT_UNKNOWN_AS_ADDR ; - -if (machine__resolve (trace->host, &al, sample) <0 ) { -pr_err ("problem processing %d event, skipping it.\n" , - event->header.type); - goto out_put; - } -perf_evsel__fprintf_callchain (evsel, sample, &al,38 , print_opts, - scripting_max_stack, trace->output); - } +trace__fprintf_callchain (trace, evsel, sample); out: ttrace->entry_pending = false; err =0 ;
@@ -2355,6 +2363,9 @@ static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel, }fprintf (trace->output,")\n" ); + +trace__fprintf_callchain (trace, evsel, sample); +return 0 ; }
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 2/11 perf thread_map: Add has() method
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding thread_map__has() to return bool of pid presence in threads map.
--- tools/perf/util/thread_map.c | 12 ++++++++++++ tools/perf/util/thread_map.h | 1 + 2 files changed, 13 insertions(+)
tools/perf/util/thread_map.c +12 -0
@@ -436,3 +436,15 @@ struct thread_map *thread_map__new_event(struct thread_map_event *event)return threads; } + +bool thread_map__has (struct thread_map *threads,pid_t pid) +{ +int i; + +for (i =0 ; i < threads->nr; ++i) { +if (threads->map[i].pid == pid) +return true; + } + +return false; +}
tools/perf/util/thread_map.h +1 -0
@@ -55,4 +55,5 @@ static inline char *thread_map__comm(struct thread_map *map, int thread) }void thread_map__read_comms (struct thread_map *threads); +bool thread_map__has (struct thread_map *threads,pid_t pid);#endif /* __PERF_THREAD_MAP_H */
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 3/11 perf cpu_map: Add has() method
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding cpu_map__has() to return bool of cpu presence in cpus map.
--- tools/perf/util/cpumap.c | 12 ++++++++++++ tools/perf/util/cpumap.h | 2 ++ 2 files changed, 14 insertions(+)
tools/perf/util/cpumap.c +12 -0
@@ -587,3 +587,15 @@ int cpu__setup_cpunode_map(void)closedir (dir1);return 0 ; } + +bool cpu_map__has (struct cpu_map *cpus,int cpu) +{ +int i; + +for (i =0 ; i < cpus->nr; ++i) { +if (cpus->map[i] == cpu) +return true; + } + +return false; +}
tools/perf/util/cpumap.h +2 -0
@@ -66,4 +66,6 @@ int cpu__get_node(int cpu);int cpu_map__build_map (struct cpu_map *cpus,struct cpu_map **res,int (*f)(struct cpu_map *map,int cpu,void *data),void *data); + +bool cpu_map__has (struct cpu_map *cpus,int cpu);#endif /* __PERF_CPUMAP_H */
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 4/11 perf sched: Add compact display option
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add compact map display that does not output the whole cpu matrix, only cpus that got event.
$ perf sched map --compact
*A0 1082427.094098 secs A0 => perf:19404 (CPU 2)
A0 *. 1082427.094127 secs . => swapper:0 (CPU 1)
A0 . *B0 1082427.094174 secs B0 => rcuos/2:25 (CPU 3)
A0 . *. 1082427.094177 secs
*C0 . . 1082427.094187 secs C0 => migration/2:21
C0 *A0 . 1082427.094193 secs
*. A0 . 1082427.094195 secs
*D0 A0 . 1082427.094402 secs D0 => rngd:968
*. A0 . 1082427.094406 secs
. *E0 . 1082427.095221 secs E0 => kworker/1:1:5333
. E0 *F0 1082427.095227 secs F0 => xterm:3342It helps to display sane output for small thread loads on big cpu servers.
--- tools/perf/Documentation/perf-sched.txt | 7 ++++ tools/perf/builtin-sched.c | 62 +++++++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 6 deletions(-)
tools/perf/Documentation/perf-sched.txt +7 -0
@@ -50,6 +50,13 @@ OPTIONS --dump-raw-trace=:: Display verbose dump of the sched data. +OPTIONS for 'perf sched map' +---------------------------- + +--compact:: + Show only CPUs with activity. Helps visualizing on high core + count systems. + SEE ALSO -------- linkperf:perf-record[1]
tools/perf/builtin-sched.c +56 -6
127 lines not on this page · raw message
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 5/11 perf sched: Use color_fprintf for output
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
As preparation for next patch.
--- tools/perf/builtin-sched.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
tools/perf/builtin-sched.c +10 -8
@@ -11,6 +11,7 @@#include "util/session.h" #include "util/tool.h" #include "util/cloexec.h" +#include "util/color.h" #include <subcmd/parse-options.h> #include "util/trace-event.h"
@@ -1357,6 +1358,7 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,int i, this_cpu = sample->cpu;int cpus_nr;bool new_cpu = false; +const char *color =PERF_COLOR_NORMAL ;BUG_ON (this_cpu >=MAX_CPUS || this_cpu <0 );
@@ -1422,26 +1424,26 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,int cpu = sched->map.comp ? sched->map.comp_cpus[i] : i;if (cpu != this_cpu) -printf (" " ); +color_fprintf (stdout, color," " );else -printf ("*" ); +color_fprintf (stdout, color,"*" );if (sched->curr_thread[cpu]) -printf ("%2s " , sched->curr_thread[cpu]->shortname); +color_fprintf (stdout, color,"%2s " , sched->curr_thread[cpu]->shortname);else -printf (" " ); +color_fprintf (stdout, color," " ); } -printf (" %12.6f secs " , (double )timestamp/1e9 ); +color_fprintf (stdout, color," %12.6f secs " , (double )timestamp/1e9 );if (new_shortname) { -printf ("%s => %s:%d" , +color_fprintf (stdout, color,"%s => %s:%d" , sched_in->shortname,thread__comm_str (sched_in), sched_in->tid); }if (sched->map.comp && new_cpu) -printf (" (CPU %d)" , this_cpu); +color_fprintf (stdout, color," (CPU %d)" , this_cpu); -printf ("\n" ); +color_fprintf (stdout, color,"\n" );thread__put (sched_in);
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 6/11 perf thread_map: Make new_by_tid_str constructor public
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
It will be used in following patch.
--- tools/perf/util/thread_map.c | 2 +- tools/perf/util/thread_map.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/thread_map.c +1 -1
@@ -260,7 +260,7 @@ struct thread_map *thread_map__new_dummy(void)return threads; } -static struct thread_map *thread_map__new_by_tid_str (const char *tid_str) +struct thread_map *thread_map__new_by_tid_str (const char *tid_str) {struct thread_map *threads =NULL , *nt;int ntasks =0 ;
tools/perf/util/thread_map.h +2 -0
@@ -31,6 +31,8 @@ void thread_map__put(struct thread_map *map);struct thread_map *thread_map__new_str (const char *pid,const char *tid,uid_t uid); +struct thread_map *thread_map__new_by_tid_str (const char *tid_str); +size_t thread_map__fprintf (struct thread_map *threads,FILE *fp);static inline int thread_map__nr (struct thread_map *threads)
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 7/11 perf sched map: Color given pids
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding --color-pids option to display selected pids in color (blue by default). It helps on navigating through the 'perf sched map' output.
--- tools/perf/Documentation/perf-sched.txt | 3 ++ tools/perf/builtin-sched.c | 77 +++++++++++++++++++++++++++++++-- 2 files changed, 76 insertions(+), 4 deletions(-)
tools/perf/Documentation/perf-sched.txt +3 -0
@@ -57,6 +57,9 @@ OPTIONS for 'perf sched map' Show only CPUs with activity. Helps visualizing on high core count systems. +--color-pids:: + Highlight the given pids. + SEE ALSO -------- linkperf:perf-record[1]
tools/perf/builtin-sched.c +73 -4
146 lines not on this page · raw message
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 8/11 perf sched map: Color given cpus
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding --color-cpus option to display selected cpus with background color (red by default). It helps on navigating through the perf sched map output.
--- tools/perf/Documentation/perf-sched.txt | 3 +++ tools/perf/builtin-sched.c | 36 ++++++++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-)
tools/perf/Documentation/perf-sched.txt +3 -0
@@ -57,6 +57,9 @@ OPTIONS for 'perf sched map' Show only CPUs with activity. Helps visualizing on high core count systems. +--color-cpus:: + Highlight the given cpus. + --color-pids:: Highlight the given pids.
tools/perf/builtin-sched.c +33 -3
@@ -125,6 +125,7 @@ struct trace_sched_handler { };#define COLOR_PIDS PERF_COLOR_BLUE +#define COLOR_CPUS PERF_COLOR_BG_REDstruct perf_sched_map { DECLARE_BITMAP(comp_cpus_mask, MAX_CPUS);
@@ -132,6 +133,8 @@ struct perf_sched_map {bool comp;struct thread_map *color_pids;const char *color_pids_str; +struct cpu_map *color_cpus; +const char *color_cpus_str; };struct perf_sched {
@@ -1461,14 +1464,18 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,int cpu = sched->map.comp ? sched->map.comp_cpus[i] : i;struct thread *curr_thread = sched->curr_thread[cpu];const char *pid_color = color; +const char *cpu_color = color;if (curr_thread &&thread__has_color (curr_thread)) pid_color =COLOR_PIDS ; +if (sched->map.color_cpus &&cpu_map__has (sched->map.color_cpus, cpu)) + cpu_color =COLOR_CPUS ; +if (cpu != this_cpu) -color_fprintf (stdout, color," " ); +color_fprintf (stdout, cpu_color," " );else -color_fprintf (stdout, color,"*" ); +color_fprintf (stdout, cpu_color,"*" );if (sched->curr_thread[cpu])color_fprintf (stdout, pid_color,"%2s " , sched->curr_thread[cpu]->shortname);
@@ -1753,7 +1760,8 @@ static int setup_map_cpus(struct perf_sched *sched)if (sched->map.comp) { sched->map.comp_cpus =zalloc (sched->max_cpu *sizeof (int )); -return sched->map.comp_cpus ?0 :-1 ; +if (!sched->map.comp_cpus) +return -1 ; }return 0 ;
@@ -1776,6 +1784,23 @@ static int setup_color_pids(struct perf_sched *sched)return 0 ; } +static int setup_color_cpus (struct perf_sched *sched) +{ +struct cpu_map *map; + +if (!sched->map.color_cpus_str) +return 0 ; + + map =cpu_map__new (sched->map.color_cpus_str); +if (!map) { +pr_err ("failed to get thread map from %s\n" , sched->map.color_cpus_str); +return -1 ; + } + + sched->map.color_cpus = map; +return 0 ; +} +static int perf_sched__map (struct perf_sched *sched) {if (setup_map_cpus (sched))
@@ -1784,6 +1809,9 @@ static int perf_sched__map(struct perf_sched *sched)if (setup_color_pids (sched))return -1 ; +if (setup_color_cpus (sched)) +return -1 ; +setup_pager ();if (perf_sched__read_events (sched))return -1 ;
@@ -1941,6 +1969,8 @@ int cmd_sched(int argc, const char **argv, const char *prefix __maybe_unused) "map output in compact mode"),OPT_STRING (0 ,"color-pids" , &sched.map.color_pids_str,"pids" ,"highlight given pids in map" ), +OPT_STRING (0 ,"color-cpus" , &sched.map.color_cpus_str,"cpus" , +"highlight given CPUs in map" ),OPT_END () }; const char * const latency_usage[] = {
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 9/11 perf sched map: Display only given cpus
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Introducing --cpus option that will display only given cpus. Could be used together with color-cpus option.
$ perf sched map --cpus 0,1
*A0 309999.786924 secs A0 => rcu_sched:7
*. 309999.786930 secs
*B0 . 309999.786931 secs B0 => rcuos/2:25
B0 *A0 309999.786947 secs--- tools/perf/Documentation/perf-sched.txt | 3 +++ tools/perf/builtin-sched.c | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+)
tools/perf/Documentation/perf-sched.txt +3 -0
@@ -57,6 +57,9 @@ OPTIONS for 'perf sched map' Show only CPUs with activity. Helps visualizing on high core count systems. +--cpus:: + Show just entries with activities for the given CPUs. + --color-cpus:: Highlight the given cpus.
tools/perf/builtin-sched.c +23 -0
@@ -135,6 +135,8 @@ struct perf_sched_map {const char *color_pids_str;struct cpu_map *color_cpus;const char *color_cpus_str; +struct cpu_map *cpus; +const char *cpus_str; };struct perf_sched {
@@ -1469,6 +1471,9 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,if (curr_thread &&thread__has_color (curr_thread)) pid_color =COLOR_PIDS ; +if (sched->map.cpus && !cpu_map__has (sched->map.cpus, cpu)) +continue ; +if (sched->map.color_cpus &&cpu_map__has (sched->map.color_cpus, cpu)) cpu_color =COLOR_CPUS ;
@@ -1483,6 +1488,9 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,color_fprintf (stdout, color," " ); } +if (sched->map.cpus && !cpu_map__has (sched->map.cpus, this_cpu)) + goto out; +color_fprintf (stdout, color," %12.6f secs " , (double )timestamp/1e9 );if (new_shortname) {const char *pid_color = color;
@@ -1497,6 +1505,7 @@ static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,if (sched->map.comp && new_cpu)color_fprintf (stdout, color," (CPU %d)" , this_cpu); +out:color_fprintf (stdout, color,"\n" );thread__put (sched_in);
@@ -1756,6 +1765,8 @@ static int perf_sched__lat(struct perf_sched *sched)static int setup_map_cpus (struct perf_sched *sched) { +struct cpu_map *map; + sched->max_cpu =sysconf (_SC_NPROCESSORS_CONF);if (sched->map.comp) {
@@ -1764,6 +1775,16 @@ static int setup_map_cpus(struct perf_sched *sched)return -1 ; } +if (!sched->map.cpus_str) +return 0 ; + + map =cpu_map__new (sched->map.cpus_str); +if (!map) { +pr_err ("failed to get cpus map from %s\n" , sched->map.cpus_str); +return -1 ; + } + + sched->map.cpus = map;return 0 ; }
@@ -1971,6 +1992,8 @@ int cmd_sched(int argc, const char **argv, const char *prefix __maybe_unused) "highlight given pids in map"),OPT_STRING (0 ,"color-cpus" , &sched.map.color_cpus_str,"cpus" ,"highlight given CPUs in map" ), +OPT_STRING (0 ,"cpus" , &sched.map.cpus_str,"cpus" , +"display given CPUs in map" ),OPT_END () }; const char * const latency_usage[] = {
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 10/11 perf evsel: Move some methods from session.[ch] to evsel.[ch]
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Those were converted to be evsel methods long ago, move the source to where it belongs.
--- tools/perf/builtin-script.c | 14 ++--- tools/perf/builtin-trace.c | 6 +- tools/perf/util/evsel.c | 131 ++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/evsel.h | 13 +++++ tools/perf/util/session.c | 130 ------------------------------------------- tools/perf/util/session.h | 13 ----- 6 files changed, 154 insertions(+), 153 deletions(-)
tools/perf/builtin-script.c +7 -7
@@ -317,19 +317,19 @@ static void set_print_ip_opts(struct perf_event_attr *attr) output[type].print_ip_opts =0 ;if (PRINT_FIELD (IP )) - output[type].print_ip_opts |=PRINT_IP_OPT_IP ; + output[type].print_ip_opts |=EVSEL__PRINT_IP ;if (PRINT_FIELD (SYM )) - output[type].print_ip_opts |=PRINT_IP_OPT_SYM ; + output[type].print_ip_opts |=EVSEL__PRINT_SYM ;if (PRINT_FIELD (DSO )) - output[type].print_ip_opts |=PRINT_IP_OPT_DSO ; + output[type].print_ip_opts |=EVSEL__PRINT_DSO ;if (PRINT_FIELD (SYMOFFSET )) - output[type].print_ip_opts |=PRINT_IP_OPT_SYMOFFSET ; + output[type].print_ip_opts |=EVSEL__PRINT_SYMOFFSET ;if (PRINT_FIELD (SRCLINE )) - output[type].print_ip_opts |=PRINT_IP_OPT_SRCLINE ; + output[type].print_ip_opts |=EVSEL__PRINT_SRCLINE ; }/*
@@ -574,9 +574,9 @@ static void print_sample_bts(struct perf_sample *sample,printf ("\n" ); }else {printf (" " ); -if (print_opts &PRINT_IP_OPT_SRCLINE ) { +if (print_opts &EVSEL__PRINT_SRCLINE ) { print_srcline_last = true; - print_opts &= ~PRINT_IP_OPT_SRCLINE ; + print_opts &= ~EVSEL__PRINT_SRCLINE ; } } perf_evsel__fprintf_sym(evsel, sample, al, 0, print_opts,
tools/perf/builtin-trace.c +3 -3
@@ -2119,9 +2119,9 @@ static int trace__fprintf_callchain(struct trace *trace, struct perf_evsel *evse {struct addr_location al;/* TODO: user-configurable print_opts */ -const unsigned int print_opts =PRINT_IP_OPT_SYM | -PRINT_IP_OPT_DSO | -PRINT_IP_OPT_UNKNOWN_AS_ADDR ; +const unsigned int print_opts =EVSEL__PRINT_SYM | +EVSEL__PRINT_DSO | +EVSEL__PRINT_UNKNOWN_AS_ADDR ;if (sample->callchain ==NULL )return 0 ;
tools/perf/util/evsel.c +131 -0
137 lines not on this page · raw message
tools/perf/util/evsel.h +13 -0
@@ -387,12 +387,25 @@ struct perf_attr_details {int perf_evsel__fprintf (struct perf_evsel *evsel,struct perf_attr_details *details,FILE *fp); +#define EVSEL__PRINT_IP (1<<0) +#define EVSEL__PRINT_SYM (1<<1) +#define EVSEL__PRINT_DSO (1<<2) +#define EVSEL__PRINT_SYMOFFSET (1<<3) +#define EVSEL__PRINT_ONELINE (1<<4) +#define EVSEL__PRINT_SRCLINE (1<<5) +#define EVSEL__PRINT_UNKNOWN_AS_ADDR (1<<6) +int perf_evsel__fprintf_callchain (struct perf_evsel *evsel,struct perf_sample *sample,struct addr_location *al,int left_alignment,unsigned int print_opts,unsigned int stack_depth,FILE *fp); +int perf_evsel__fprintf_sym (struct perf_evsel *evsel,struct perf_sample *sample, +struct addr_location *al,int left_alignment, +unsigned int print_opts,unsigned int stack_depth, +FILE *fp); +bool perf_evsel__fallback (struct perf_evsel *evsel,int err,char *msg,size_t msgsize); int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
tools/perf/util/session.c +0 -130
136 lines not on this page · raw message
tools/perf/util/session.h +0 -13
@@ -36,14 +36,6 @@ struct perf_session {struct perf_tool *tool; }; -#define PRINT_IP_OPT_IP (1<<0) -#define PRINT_IP_OPT_SYM (1<<1) -#define PRINT_IP_OPT_DSO (1<<2) -#define PRINT_IP_OPT_SYMOFFSET (1<<3) -#define PRINT_IP_OPT_ONELINE (1<<4) -#define PRINT_IP_OPT_SRCLINE (1<<5) -#define PRINT_IP_OPT_UNKNOWN_AS_ADDR (1<<6) -struct perf_tool ; struct perf_session *perf_session__new(struct perf_data_file *file,
@@ -105,11 +97,6 @@ size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp);struct perf_evsel *perf_session__find_first_evtype (struct perf_session *session,unsigned int type); -int perf_evsel__fprintf_sym (struct perf_evsel *evsel,struct perf_sample *sample, -struct addr_location *al,int left_alignment, -unsigned int print_opts,unsigned int stack_depth, -FILE *fp); -int perf_session__cpu_bitmap (struct perf_session *session,const char *cpu_list,unsigned long *cpu_bitmap);
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 11/11 perf trace: Do not accept --no-syscalls together with -e
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Doesn't make sense and was causing a segfault, fix it.
# trace -e clone --no-syscalls --event sched:*exec firefox The -e option can't be used with --no-syscalls.
--- tools/perf/builtin-trace.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/perf/builtin-trace.c +7 -0
@@ -3344,6 +3344,8 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) goto out; } + err =-1 ; +if (trace.trace_pgfaults) { trace.opts.sample_address = true; trace.opts.sample_time = true;
@@ -3368,6 +3370,11 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)return -1 ; } +if (!trace.trace_syscalls && ev_qualifier_str) { +pr_err ("The -e option can't be used with --no-syscalls.\n" ); + goto out; + } +if (output_name !=NULL ) { err =trace__open_output (&trace, output_name);if (err <0 ) {
Signature · 1 line
2.5.5
Quoted 71 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
31d50c551e30923b86a1b5b420920dd1927fa63b:perf/x86/amd/uncore: Do not register a task ctx for uncore PMUs (2016-04-13 11:56:36 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-20160413for you to fetch changes up to
59247e33ff494e3643cdff54b64bf72575052b76:perf trace: Do not accept --no-syscalls together with -e (2016-04-13 10:11:52 -0300)----------------------------------------------------------------
perf/core improvements and fixes:User visible:
- Print callchains asked for events requested via 'perf trace --event' too:
(Arnaldo Carvalho de Melo)# trace -e nanosleep --call dwarf --event sched:sched_switch/call-graph=fp/ usleep 1 0.346 (0.005 ms): usleep/24428 nanosleep(rqtp: 0x7fffa15a0540) ... 0.346 ( ): sched:sched_switch:usleep:24428 [120] S ==> swapper/3:0 [120]) __schedule+0xfe200402 ([kernel.kallsyms]) schedule+0xfe200035 ([kernel.kallsyms]) do_nanosleep+0xfe20006f ([kernel.kallsyms]) hrtimer_nanosleep+0xfe2000dc ([kernel.kallsyms]) sys_nanosleep+0xfe20007a ([kernel.kallsyms]) do_syscall_64+0xfe200062 ([kernel.kallsyms]) return_from_SYSCALL_64+0xfe200000 ([kernel.kallsyms]) __nanosleep+0xffff005b8d602010 (/usr/lib64/libc-2.22.so) 0.400 (0.059 ms): usleep/24428 ... [continued]: nanosleep()) = 0 __nanosleep+0x10 (/usr/lib64/libc-2.22.so) usleep+0x34 (/usr/lib64/libc-2.22.so) main+0x1eb (/usr/bin/usleep) __libc_start_main+0xf0 (/usr/lib64/libc-2.22.so) _start+0x29 (/usr/bin/usleep)- Allow requesting that some CPUs or PIDs be highlighted in 'perf sched map' (Jiri Olsa)
- Compact 'perf sched map' to show just CPUs with activity, improving the output in high core count systems (Jiri Olsa)
- Fix segfault with 'perf trace --no-syscalls -e syscall-names' by bailing out such request, doesn't make sense to ask for no syscalls and then specify which ones should be printed (Arnaldo Carvalho de Melo)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (3):
perf trace: Support callchains for --event too perf evsel: Move some methods from session.[ch] to evsel.[ch] perf trace: Do not accept --no-syscalls together with -eJiri Olsa (8):
perfthread_map: Addhas()method
perfcpu_map: Addhas()method
perf sched: Add compact display option
perf sched: Usecolor_fprintffor output
perfthread_map: Makenew_by_tid_strconstructor public perf sched map: Color given pids
perf sched map: Color given cpus
perf sched map: Display only given cpus
Quoted 13 lines
tools/perf/Documentation/perf-sched.txt | 16 +++ tools/perf/builtin-sched.c | 198 ++++++++++++++++++++++++++++++-- tools/perf/builtin-script.c | 14 +-- tools/perf/builtin-trace.c | 48 +++++--- tools/perf/util/cpumap.c | 12 ++ tools/perf/util/cpumap.h | 2 + tools/perf/util/evsel.c | 131 +++++++++++++++++++++ tools/perf/util/evsel.h | 13 +++ tools/perf/util/session.c | 130 --------------------- tools/perf/util/session.h | 13 --- tools/perf/util/thread_map.c | 14 ++- tools/perf/util/thread_map.h | 3 + 12 files changed, 416 insertions(+), 178 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo