perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit f1d800bf615b84ca253af372d2dac8cdef743a20:
Merge tag 'perf-ebpf-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2015-08-08 10:05:17 +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
for you to fetch changes up to 4605bb55b91449a1a953a51f0334d3bc02351adb:
perf evlist: Be more specific on -F/--freq (2015-08-10 17:20:26 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
User visible:
- Introduce 'srcfile' sort key: (Andi Kleen)
# perf record -F 10000 usleep 1
# perf report --stdio --dsos '[kernel.vmlinux]' -s srcfile
<SNIP>
# Overhead Source File
26.49% copy_page_64.S
5.49% signal.c
0.51% msr.h
#It can be combined with other fields, for instance, experiment with '-s srcfile,symbol'.
There are some oddities in some distros and with some specific DSOs, being investigated, so your mileage may vary.
- Update the column width for the "srcline" sort key (Arnaldo Carvalho de Melo)
- Support per-event 'freq' term: (Namhyung Kim)
$ perf record -e 'cpu/instructions,freq=1234/',cycles -c 1000 sleep 1 $ perf evlist -F cpu/instructions,freq=1234/: sample_freq=1234 cycles: sample_period=1000 $
Infrastructure:
- Move perf_counts struct and functions into separate object (Jiri Olsa)
- Unset perf_event_attr::freq when period term is set (Jiri Olsa)
- Move callchain option parsing code to util.c (Kan Liang)
----------------------------------------------------------------
Andi Kleen (2):
perf tools: Support full source file paths for srcline perf report: Add support for srcfile sort key
Arnaldo Carvalho de Melo (2):
perf hists: hist_entry__cmp() may use he_tmp.hists, initialize it perf hists: Update the column width for the "srcline" sort key
Jiri Olsa (2):
perf stat: Move perf_counts struct and functions into separate object perf tools: Unset perf_event_attr::freq when period term is set
Kan Liang (1):
perf callchain: Move option parsing code to util.c
Namhyung Kim (2):
perf record: Support per-event freq term
perf evlist: Be more specific on -F/--freq
tools/perf/Documentation/perf-record.txt | 1 + tools/perf/Documentation/perf-report.txt | 4 ++ tools/perf/Documentation/perf-script.txt | 3 ++ tools/perf/builtin-report.c | 2 + tools/perf/builtin-script.c | 2 + tools/perf/builtin-stat.c | 1 + tools/perf/util/Build | 1 + tools/perf/util/callchain.c | 89 +------------------------------ tools/perf/util/callchain.h | 1 + tools/perf/util/counts.c | 52 ++++++++++++++++++ tools/perf/util/counts.h | 37 +++++++++++++ tools/perf/util/evsel.c | 14 ++++- tools/perf/util/evsel.h | 4 +- tools/perf/util/hist.c | 9 ++++ tools/perf/util/hist.h | 1 + tools/perf/util/parse-events.c | 6 +++ tools/perf/util/parse-events.h | 1 + tools/perf/util/parse-events.l | 1 + tools/perf/util/pmu.c | 2 +- tools/perf/util/python-ext-sources | 2 +- tools/perf/util/sort.c | 52 ++++++++++++++++++ tools/perf/util/sort.h | 2 + tools/perf/util/srcline.c | 6 ++- tools/perf/util/stat.c | 49 ----------------- tools/perf/util/stat.h | 30 ----------- tools/perf/util/util.c | 90 ++++++++++++++++++++++++++++++++ tools/perf/util/util.h | 3 ++ 27 files changed, 292 insertions(+), 173 deletions(-) create mode 100644 tools/perf/util/counts.c create mode 100644 tools/perf/util/counts.h
Arnaldo Carvalho de Melo
maintainerPATCH 1/9 perf stat: Move perf_counts struct and functions into separate object
From: Jiri Olsa <[email protected]>
Moving 'struct perf_counts' and associated functions into separate object, so we could remove stat.c object dependency from python build.
It makes the python code to build properly, because it fails to load due to missing stat-shadow.c object dependency if some patches from Kan Liang are applied.
So apply this one, then Kan's.
--- tools/perf/builtin-stat.c | 1 + tools/perf/util/Build | 1 + tools/perf/util/counts.c | 52 ++++++++++++++++++++++++++++++++++++++ tools/perf/util/counts.h | 37 +++++++++++++++++++++++++++ tools/perf/util/evsel.h | 2 +- tools/perf/util/python-ext-sources | 2 +- tools/perf/util/stat.c | 49 ----------------------------------- tools/perf/util/stat.h | 30 ---------------------- 8 files changed, 93 insertions(+), 81 deletions(-) create mode 100644 tools/perf/util/counts.c create mode 100644 tools/perf/util/counts.h
tools/perf/builtin-stat.c +1 -0
@@ -58,6 +58,7 @@#include "util/cpumap.h" #include "util/thread.h" #include "util/thread_map.h" +#include "util/counts.h" #include <stdlib.h> #include <sys/prctl.h>
tools/perf/util/Build +1 -0
@@ -68,6 +68,7 @@ libperf-y += target.o libperf-y += rblist.o libperf-y += intlist.o libperf-y += vdso.o +libperf-y += counts.o libperf-y += stat.o libperf-y += stat-shadow.o libperf-y += record.o
tools/perf/util/counts.c new file +52 -0
52 lines not on this page · raw message
tools/perf/util/counts.h new file +37 -0
@@ -0,0 +1,37 @@ +#ifndef __PERF_COUNTS_H +#define __PERF_COUNTS_H + +#include "xyarray.h" + +struct perf_counts_values { +union { +struct { +u64 val; +u64 ena; +u64 run; + }; +u64 values[3 ]; + }; +}; + +struct perf_counts { +s8 scaled; +struct perf_counts_values aggr; +struct xyarray *values; +}; + + +static inline struct perf_counts_values * +perf_counts (struct perf_counts *counts,int cpu,int thread) +{ +return xyarray__entry (counts->values, cpu, thread); +} + +struct perf_counts *perf_counts__new (int ncpus,int nthreads); +void perf_counts__delete (struct perf_counts *counts); + +void perf_evsel__reset_counts (struct perf_evsel *evsel); +int perf_evsel__alloc_counts (struct perf_evsel *evsel,int ncpus,int nthreads); +void perf_evsel__free_counts (struct perf_evsel *evsel); + +#endif /* __PERF_COUNTS_H */
tools/perf/util/evsel.h +1 -1
@@ -9,7 +9,7 @@#include "xyarray.h" #include "symbol.h" #include "cpumap.h" -#include "stat.h" +#include "counts.h" struct perf_evsel ;
tools/perf/util/python-ext-sources +1 -1
@@ -16,7 +16,7 @@ util/util.c util/xyarray.c util/cgroup.c util/rblist.c -util/stat.c +util/counts.c util/strlist.c util/trace-event.c ../lib/rbtree.c
tools/perf/util/stat.c +0 -49
55 lines not on this page · raw message
tools/perf/util/stat.h +0 -30
@@ -33,23 +33,6 @@ enum aggr_mode { AGGR_THREAD, }; -struct perf_counts_values { -union { -struct { -u64 val; -u64 ena; -u64 run; - }; -u64 values[3 ]; - }; -}; - -struct perf_counts { -s8 scaled; -struct perf_counts_values aggr; -struct xyarray *values; -}; -struct perf_stat_config {enum aggr_mode aggr_mode;bool scale;
@@ -57,12 +40,6 @@ struct perf_stat_config {unsigned int interval; }; -static inline struct perf_counts_values * -perf_counts (struct perf_counts *counts,int cpu,int thread) -{ -return xyarray__entry (counts->values, cpu, thread); -} -void update_stats (struct stats *stats,u64 val);double avg_stats (struct stats *stats);double stddev_stats (struct stats *stats);
@@ -96,13 +73,6 @@ void perf_stat__update_shadow_stats(struct perf_evsel *counter, u64 *count,void perf_stat__print_shadow_stats (FILE *out,struct perf_evsel *evsel,double avg,int cpu,enum aggr_mode aggr); -struct perf_counts *perf_counts__new (int ncpus,int nthreads); -void perf_counts__delete (struct perf_counts *counts); - -void perf_evsel__reset_counts (struct perf_evsel *evsel); -int perf_evsel__alloc_counts (struct perf_evsel *evsel,int ncpus,int nthreads); -void perf_evsel__free_counts (struct perf_evsel *evsel); -void perf_evsel__reset_stat_priv (struct perf_evsel *evsel);int perf_evsel__alloc_stat_priv (struct perf_evsel *evsel);void perf_evsel__free_stat_priv (struct perf_evsel *evsel);
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 2/9 perf callchain: Move option parsing code to util.c
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Move callchain option parse related code to util.c, to avoid dragging more object files into the python binding.
--- tools/perf/util/callchain.c | 89 +------------------------------------------- tools/perf/util/callchain.h | 1 + tools/perf/util/util.c | 90 +++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/util.h | 2 + 4 files changed, 94 insertions(+), 88 deletions(-)
tools/perf/util/callchain.c +1 -88
@@ -25,96 +25,9 @@ __threadstruct callchain_cursor callchain_cursor; -#ifdef HAVE_DWARF_UNWIND_SUPPORT -static int get_stack_size (const char *str,unsigned long *_size) -{ -char *endptr; -unsigned long size; -unsigned long max_size =round_down (USHRT_MAX ,sizeof (u64)); - - size =strtoul (str, &endptr,0 ); - -do { -if (*endptr) -break ; - - size =round_up (size,sizeof (u64)); -if (!size || size > max_size) -break ; - - *_size = size; -return 0 ; - - }while (0 ); - -pr_err ("callchain: Incorrect stack dump size (max %ld): %s\n" , - max_size, str); -return -1 ; -} -#endif /* HAVE_DWARF_UNWIND_SUPPORT */ -int parse_callchain_record_opt (const char *arg,struct callchain_param *param) { -char *tok, *name, *saveptr =NULL ; -char *buf; -int ret =-1 ; - -/* We need buffer that we know we can write to. */ - buf =malloc (strlen (arg) +1 ); -if (!buf) -return -ENOMEM ; - -strcpy (buf, arg); - - tok =strtok_r ((char *)buf,"," , &saveptr); - name = tok ? : (char *)buf; - -do { -/* Framepointer style */ -if (!strncmp (name,"fp" ,sizeof ("fp" ))) { -if (!strtok_r (NULL ,"," , &saveptr)) { - param->record_mode =CALLCHAIN_FP ; - ret =0 ; - }else -pr_err ("callchain: No more arguments " -"needed for --call-graph fp\n" ); -break ; - -#ifdef HAVE_DWARF_UNWIND_SUPPORT - /* Dwarf style */ - }else if (!strncmp (name,"dwarf" ,sizeof ("dwarf" ))) { -const unsigned long default_stack_dump_size =8192 ; - - ret =0 ; - param->record_mode =CALLCHAIN_DWARF ; - param->dump_size = default_stack_dump_size; - - tok =strtok_r (NULL ,"," , &saveptr); -if (tok) { -unsigned long size =0 ; - - ret =get_stack_size (tok, &size); - param->dump_size = size; - } -#endif /* HAVE_DWARF_UNWIND_SUPPORT */ - }else if (!strncmp (name,"lbr" ,sizeof ("lbr" ))) { -if (!strtok_r (NULL ,"," , &saveptr)) { - param->record_mode =CALLCHAIN_LBR ; - ret =0 ; - }else -pr_err ("callchain: No more arguments " -"needed for --call-graph lbr\n" ); -break ; - }else { -pr_err ("callchain: Unknown --call-graph option " -"value: %s\n" , arg); -break ; - } - - }while (0 ); - -free (buf); -return ret; +return parse_callchain_record (arg, param); }static int parse_callchain_mode (const char *value)
tools/perf/util/callchain.h +1 -0
@@ -177,6 +177,7 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node * bool hide_unresolved);extern const char record_callchain_help[]; +extern int parse_callchain_record (const char *arg,struct callchain_param *param);int parse_callchain_record_opt (const char *arg,struct callchain_param *param);int parse_callchain_report_opt (const char *arg);int perf_callchain_config (const char *var,const char *value);
tools/perf/util/util.c +90 -0
96 lines not on this page · raw message
tools/perf/util/util.h +2 -0
@@ -351,4 +351,6 @@ static inline char *asprintf_expr_not_in_ints(const char *var, size_t nints, int return asprintf_expr_inout_ints(var, false, nints, ints); } +int get_stack_size (const char *str,unsigned long *_size); +#endif /* GIT_COMPAT_UTIL_H */
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 3/9 perf tools: Support full source file paths for srcline
In reply to Arnaldo Carvalho de MeloFrom: Andi Kleen <[email protected]>
For perf report/script srcline currently only the base file name of the source file is printed. This is a good default because it usually fits on the screen.
But in some cases we want to know the full file name, for example to aggregate hits per file.
In the later case we need more than the base file name to resolve file naming collisions: for example the kernel source has ~70 files named "core.c"
It's also useful as input to post processing tools which want to point to the right file.
Add a flag to allow full file name output.
Add an option to perf report/script to enable this option.
--- tools/perf/Documentation/perf-report.txt | 2 ++ tools/perf/Documentation/perf-script.txt | 3 +++ tools/perf/builtin-report.c | 2 ++ tools/perf/builtin-script.c | 2 ++ tools/perf/util/srcline.c | 6 +++++- tools/perf/util/util.h | 1 + 6 files changed, 15 insertions(+), 1 deletion(-)
tools/perf/Documentation/perf-report.txt +2 -0
@@ -354,6 +354,8 @@ OPTIONS To disable decoding entirely, use --no-itrace. +--full-source-path:: + Show the full path for source files for srcline output. include::callchain-overhead-calculation.txt[]
tools/perf/Documentation/perf-script.txt +3 -0
@@ -260,6 +260,9 @@ OPTIONS To disable decoding entirely, use --no-itrace. +--full-source-path:: + Show the full path for source files for srcline output. + SEE ALSO -------- linkperf:perf-record[1], linkperf:perf-script-perl[1],
tools/perf/builtin-report.c +2 -0
@@ -738,6 +738,8 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)OPT_CALLBACK_OPTARG (0 ,"itrace" , &itrace_synth_opts,NULL ,"opts" ,"Instruction Tracing options" , itrace_parse_synth_opts), +OPT_BOOLEAN (0 ,"full-source-path" , &srcline_full_filename, +"Show full source file name path for source lines" ),OPT_END () }; struct perf_data_file file = {
tools/perf/builtin-script.c +2 -0
@@ -1653,6 +1653,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)OPT_CALLBACK_OPTARG (0 ,"itrace" , &itrace_synth_opts,NULL ,"opts" ,"Instruction Tracing options" , itrace_parse_synth_opts), +OPT_BOOLEAN (0 ,"full-source-path" , &srcline_full_filename, +"Show full source file name path for source lines" ), OPT_END() };const char *const script_subcommands[] = {"record" ,"report" ,NULL };
tools/perf/util/srcline.c +5 -1
@@ -10,6 +10,8 @@#include "symbol.h" +bool srcline_full_filename; +#ifdef HAVE_LIBBFD_SUPPORT /*
@@ -277,7 +279,9 @@ char *get_srcline(struct dso *dso, u64 addr, struct symbol *sym,if (!addr2line (dso_name, addr, &file, &line, dso)) goto out; -if (asprintf (&srcline,"%s:%u" ,basename (file), line) <0 ) { +if (asprintf (&srcline,"%s:%u" , + srcline_full_filename ? file :basename (file), + line) <0 ) {free (file); goto out; }
tools/perf/util/util.h +1 -0
@@ -318,6 +318,7 @@ static inline int path__join3(char *bf, size_t size,struct dso ;struct symbol ; +extern bool srcline_full_filename;char *get_srcline (struct dso *dso,u64 addr,struct symbol *sym,bool show_sym);void free_srcline (char *srcline);
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 4/9 perf tools: Unset perf_event_attr::freq when period term is set
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
We need to unset 'perf_event_attr::freq' bit (default 1) when 'period' term is specified within event definition like:
-e 'cpu/cpu-cycles,call-graph=fp,time,period=100000'
otherwise it will handle the period value as frequency (and fail if it crossed the maximum allowed frequency value).
--- tools/perf/util/evsel.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/evsel.c +1 -0
@@ -598,6 +598,7 @@ static void apply_config_terms(struct perf_evsel *evsel)switch (term->type) {case PERF_EVSEL__CONFIG_TERM_PERIOD : attr->sample_period = term->val.period; + attr->freq =0 ;break ;case PERF_EVSEL__CONFIG_TERM_TIME :if (term->val.time)
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 5/9 perf hists: hist_entry__cmp() may use he_tmp.hists, initialize it
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
The iter_add_next_cumulative_entry() function calls hist_entry__cmp(), which may want to access the hists where this hist_entry is stored, initialize it to let that happen and avoid segfaults.
--- tools/perf/util/hist.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/hist.c +1 -0
@@ -761,6 +761,7 @@ iter_add_next_cumulative_entry(struct hist_entry_iter *iter,struct hist_entry **he_cache = iter->priv;struct hist_entry *he;struct hist_entry he_tmp = { + .hists =evsel__hists (evsel), .cpu = al->cpu, .thread = al->thread, .comm =thread__comm (al->thread),
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 6/9 perf hists: Update the column width for the "srcline" sort key
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
When we introduce a new sort key, we need to update the hists__calc_col_len() function accordingly, otherwise the width will be limited to strlen(header).
We can't update it when obtaining a line value for a column (for instance, in sort__srcline_cmp()), because we reset it all when doing a resort (see hists__output_recalc_col_len()), so we need to, from what is in the hist_entry fields, set each of the column widths.
--- tools/perf/util/hist.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/hist.c +3 -0
@@ -151,6 +151,9 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)hists__new_col_len (hists,HISTC_LOCAL_WEIGHT ,12 );hists__new_col_len (hists,HISTC_GLOBAL_WEIGHT ,12 ); +if (h->srcline) +hists__new_col_len (hists,HISTC_SRCLINE ,strlen (h->srcline)); +if (h->transaction)hists__new_col_len (hists,HISTC_TRANSACTION ,hist_entry__transaction_len ());
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 7/9 perf report: Add support for srcfile sort key
In reply to Arnaldo Carvalho de MeloFrom: Andi Kleen <[email protected]>
In some cases it's useful to characterize samples by file. This is useful to get a higher level categorization, for example to map cost to subsystems.
Add a srcfile sort key to perf report. It builds on top of the existing srcline support.
Commiter notes:
E.g.:
# perf record -F 10000 usleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.016 MB perf.data (13 samples) ]
[root@zoo ~]# perf report -s srcfile --stdio
# Total Lost Samples: 0
#
# Samples: 13 of event 'cycles'
# Event count (approx.): 869878
#
# Overhead Source File
# ........ ...........
60.99% .
20.62% paravirt.h
14.23% rmap.c
4.04% signal.c
0.11% msr.h#
The first line is collecting all the files for which srcfiles couldn't somehow get resolved to:
# perf report -s srcfile,dso --stdio
# Total Lost Samples: 0
#
# Samples: 13 of event 'cycles'
# Event count (approx.): 869878
#
# Overhead Source File Shared Object
# ........ ........... ................
40.97% . ld-2.20.so
20.62% paravirt.h [kernel.vmlinux]
20.02% . libc-2.20.so
14.23% rmap.c [kernel.vmlinux]
4.04% signal.c [kernel.vmlinux]
0.11% msr.h [kernel.vmlinux]#
XXX: Investigate why that is not resolving on Fedora 21, Andi says he hasn't
seen this on Fedora 22.
--- tools/perf/Documentation/perf-report.txt | 2 ++ tools/perf/util/hist.c | 5 +++ tools/perf/util/hist.h | 1 + tools/perf/util/sort.c | 52 ++++++++++++++++++++++++++++++++ tools/perf/util/sort.h | 2 ++ 5 files changed, 62 insertions(+)
tools/perf/Documentation/perf-report.txt +2 -0
@@ -81,6 +81,8 @@ OPTIONS - cpu: cpu number the task ran at the time of sample - srcline: filename and line number executed at the time of sample. The DWARF debugging info must be provided. + - srcfile: file name of the source file of the same. Requires dwarf + information. - weight: Event specific weight, e.g. memory latency or transaction abort cost. This is the global weight. - local_weight: Local weight version of the weight above.
tools/perf/util/hist.c +5 -0
@@ -154,6 +154,9 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)if (h->srcline)hists__new_col_len (hists,HISTC_SRCLINE ,strlen (h->srcline)); +if (h->srcfile) +hists__new_col_len (hists,HISTC_SRCFILE ,strlen (h->srcfile)); +if (h->transaction)hists__new_col_len (hists,HISTC_TRANSACTION ,hist_entry__transaction_len ());
@@ -949,6 +952,8 @@ void hist_entry__delete(struct hist_entry *he)zfree (&he->stat_acc);free_srcline (he->srcline); +if (he->srcfile && he->srcfile[0 ]) +free (he->srcfile);free_callchain (he->callchain);free (he); }
tools/perf/util/hist.h +1 -0
@@ -30,6 +30,7 @@ enum hist_column {HISTC_PARENT ,HISTC_CPU ,HISTC_SRCLINE , +HISTC_SRCFILE ,HISTC_MISPREDICT ,HISTC_IN_TX , HISTC_ABORT,
tools/perf/util/sort.c +52 -0
64 lines not on this page · raw message
tools/perf/util/sort.h +2 -0
@@ -114,6 +114,7 @@ struct hist_entry { }; };char *srcline; +char *srcfile;struct symbol *parent;struct rb_root sorted_chain;struct branch_info *branch_info;
@@ -172,6 +173,7 @@ enum sort_type {SORT_PARENT ,SORT_CPU ,SORT_SRCLINE , +SORT_SRCFILE ,SORT_LOCAL_WEIGHT ,SORT_GLOBAL_WEIGHT , SORT_TRANSACTION,
Signature · 1 line
2.1.0
Namhyung Kim
maintainerRe: [PATCH 7/9] perf report: Add support for srcfile sort key
Quoted 127 lines · Arnaldo Carvalho de Melo
From: Andi Kleen <[email protected]>
In some cases it's useful to characterize samples by file. This is useful to get a higher level categorization, for example to map cost to subsystems.
Add a srcfile sort key to perf report. It builds on top of the existing srcline support.
Commiter notes:
E.g.:
# perf record -F 10000 usleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.016 MB perf.data (13 samples) ] [root@zoo ~]# perf report -s srcfile --stdio # Total Lost Samples: 0 # # Samples: 13 of event 'cycles' # Event count (approx.): 869878 # # Overhead Source File # ........ ........... 60.99% . 20.62% paravirt.h 14.23% rmap.c 4.04% signal.c 0.11% msr.h#
The first line is collecting all the files for which srcfiles couldn't somehow get resolved to:
# perf report -s srcfile,dso --stdio # Total Lost Samples: 0 # # Samples: 13 of event 'cycles' # Event count (approx.): 869878 # # Overhead Source File Shared Object # ........ ........... ................ 40.97% . ld-2.20.so 20.62% paravirt.h [kernel.vmlinux] 20.02% . libc-2.20.so 14.23% rmap.c [kernel.vmlinux] 4.04% signal.c [kernel.vmlinux] 0.11% msr.h [kernel.vmlinux]#
XXX: Investigate why that is not resolving on Fedora 21, Andi says he hasn't
seen this on Fedora 22.Signed-off-by Andi Kleen <[email protected]>Cc Jiri Olsa <[email protected]>Cc Namhyung Kim <[email protected]>[ Added column length update, from 0e65bdb3f90f ('perf hists: Update the column width for the "srcline" sort key') ]Signed-off-by Arnaldo Carvalho de Melo <[email protected]>--- tools/perf/Documentation/perf-report.txt | 2 ++ tools/perf/util/hist.c | 5 +++ tools/perf/util/hist.h | 1 + tools/perf/util/sort.c | 52 ++++++++++++++++++++++++++++++++ tools/perf/util/sort.h | 2 ++ 5 files changed, 62 insertions(+)tools/perf/Documentation/perf-report.txt +2
-0@@ -81,6 +81,8 @@ OPTIONS - cpu: cpu number the task ran at the time of sample - srcline: filename and line number executed at the time of sample. The DWARF debugging info must be provided. + - srcfile: file name of the source file of the same. Requires dwarf + information. - weight: Event specific weight, e.g. memory latency or transaction abort cost. This is the global weight. - local_weight: Local weight version of the weight above.tools/perf/util/hist.c +5
-0@@ -154,6 +154,9 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)if (h->srcline)hists__new_col_len (hists,HISTC_SRCLINE ,strlen (h->srcline)); +if (h->srcfile) +hists__new_col_len (hists,HISTC_SRCFILE ,strlen (h->srcfile)); +if (h->transaction)hists__new_col_len (hists,HISTC_TRANSACTION ,hist_entry__transaction_len ());@@ -949,6 +952,8 @@ void hist_entry__delete(struct hist_entry *he)zfree (&he->stat_acc);free_srcline (he->srcline); +if (he->srcfile && he->srcfile[0 ]) +free (he->srcfile);free_callchain (he->callchain);free (he); }tools/perf/util/hist.h +1
-0@@ -30,6 +30,7 @@ enum hist_column {HISTC_PARENT ,HISTC_CPU ,HISTC_SRCLINE , +HISTC_SRCFILE ,HISTC_MISPREDICT ,HISTC_IN_TX , HISTC_ABORT,tools/perf/util/sort.c +1
-0@@ -319,6 +319,57 @@ struct sort_entry sort_srcline = { .se_width_idx = HISTC_SRCLINE, }; +/* --sort srcfile */
tools/perf/util/sort.c struct sort_entry sort_srcline = { · line 332
Quoted 10 lines
tools/perf/util/sort.c +10
-0+ +static char no_srcfile[1 ]; + +static char *get_srcfile (struct hist_entry *e) +{ +char *sf, *p; +struct map *map = e->ms.map; + + sf =get_srcline (map->dso,map__rip_2objdump (map, e->ip), + e->ms.sym, true);
AFAIK get_srcline() can return a string literal SRCLINE_UNKNOWN. It should not be freed or altered..
Thanks,
Namhyung
Quoted 74 lines
tools/perf/util/sort.c +41
-0+ p =strchr (sf,':' ); +if (p && *sf) { + *p =0 ; +return sf; + } +free (sf); +return no_srcfile; +} + +static int64_t +sort__srcfile_cmp (struct hist_entry *left,struct hist_entry *right) +{ +if (!left->srcfile) { +if (!left->ms.map) + left->srcfile = no_srcfile; +else + left->srcfile =get_srcfile (left); + } +if (!right->srcfile) { +if (!right->ms.map) + right->srcfile = no_srcfile; +else + right->srcfile =get_srcfile (right); + } +return strcmp (right->srcfile, left->srcfile); +} + +static int hist_entry__srcfile_snprintf (struct hist_entry *he,char *bf, +size_t size,unsigned int width) +{ +return repsep_snprintf (bf, size,"%-*.*s" , width, width, he->srcfile); +} + +struct sort_entry sort_srcfile = { + .se_header ="Source File" , + .se_cmp = sort__srcfile_cmp, + .se_snprintf = hist_entry__srcfile_snprintf, + .se_width_idx =HISTC_SRCFILE , +}; +/* --sort parent */ static int64_t@@ -1196,6 +1247,7 @@ static struct sort_dimension common_sort_dimensions[] = {DIM (SORT_PARENT ,"parent" , sort_parent),DIM (SORT_CPU ,"cpu" , sort_cpu),DIM (SORT_SRCLINE ,"srcline" , sort_srcline), +DIM (SORT_SRCFILE ,"srcfile" , sort_srcfile),DIM (SORT_LOCAL_WEIGHT ,"local_weight" , sort_local_weight),DIM (SORT_GLOBAL_WEIGHT ,"weight" , sort_global_weight), DIM(SORT_TRANSACTION, "transaction", sort_transaction),tools/perf/util/sort.h +2
-0@@ -114,6 +114,7 @@ struct hist_entry { }; };char *srcline; +char *srcfile;struct symbol *parent;struct rb_root sorted_chain;struct branch_info *branch_info;@@ -172,6 +173,7 @@ enum sort_type {SORT_PARENT ,SORT_CPU ,SORT_SRCLINE , +SORT_SRCFILE ,SORT_LOCAL_WEIGHT ,SORT_GLOBAL_WEIGHT , SORT_TRANSACTION,Signature · 1 line
2.1.0
Re: [PATCH 7/9] perf report: Add support for srcfile sort key
Quoted 3 lines
AFAIK
get_srcline()can return a string literalSRCLINE_UNKNOWN. It should not be freed or altered..
Good point. Here's a patch.
---
perf, tools: Check for SRCLINE_UNKNOWN case in srcline
Handle the SRCLINE_UNKNOWN case correctly when processing srcfile.
Pointed out by Namhyung.
tools/perf/util/sort.c +2 -0
@@ -330,6 +330,8 @@ static char *get_srcfile(struct hist_entry *e) sf =get_srcline (map->dso,map__rip_2objdump (map, e->ip), e->ms.sym, true); +if (!strcmp (sf,SRCLINE_UNKNOWN )) +return no_srcfile; p =strchr (sf,':' );if (p && *sf) { *p =0 ;
tip-bot for Andi Kleen
merge bot[tip:perf/core] perf sort: Check for SRCLINE_UNKNOWN case in " srcfile" processing
perf sort: Check for SRCLINE_UNKNOWN case in "srcfile" processing
Commit-ID: 76b10655818c939e257377f83992975a5f55ffb3 Gitweb: http://git.kernel.org/tip/76b10655818c939e257377f83992975a5f55ffb3 Author: Andi Kleen <[email protected]> AuthorDate: Tue, 11 Aug 2015 06:36:55 -0700 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 12 Aug 2015 10:27:02 -0300
perf sort: Check for SRCLINE_UNKNOWN case in "srcfile" processing
Handle the SRCLINE_UNKNOWN case correctly when processing "srcfile".
Commiter note:
We can't just free it, as it was't allocated via malloc, its a guard variable.
--- tools/perf/util/sort.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/sort.c +2 -0
@@ -330,6 +330,8 @@ static char *get_srcfile(struct hist_entry *e) sf =get_srcline (map->dso,map__rip_2objdump (map, e->ip), e->ms.sym, true); +if (!strcmp (sf,SRCLINE_UNKNOWN )) +return no_srcfile; p =strchr (sf,':' );if (p && *sf) { *p =0 ;
Arnaldo Carvalho de Melo
maintainerPATCH 8/9 perf record: Support per-event freq term
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
Now perf can set per-event value of time and (sampling) period. But I guess most users like me just want to set frequency rather than period. So add the 'freq' term in the event parser.
--- tools/perf/Documentation/perf-record.txt | 1 + tools/perf/util/evsel.c | 4 ++++ tools/perf/util/evsel.h | 2 ++ tools/perf/util/parse-events.c | 6 ++++++ tools/perf/util/parse-events.h | 1 + tools/perf/util/parse-events.l | 1 + tools/perf/util/pmu.c | 2 +- 7 files changed, 16 insertions(+), 1 deletion(-)
tools/perf/Documentation/perf-record.txt +1 -0
@@ -49,6 +49,7 @@ OPTIONS These params can be used to overload default config values per event. Here is a list of the params. - 'period': Set event sampling period + - 'freq': Set event sampling frequency - 'time': Disable/enable time stamping. Acceptable values are 1 for enabling time stamping. 0 for disabling time stamping. The default is 1.
tools/perf/util/evsel.c +4 -0
@@ -600,6 +600,10 @@ static void apply_config_terms(struct perf_evsel *evsel) attr->sample_period = term->val.period; attr->freq =0 ;break ; +case PERF_EVSEL__CONFIG_TERM_FREQ : + attr->sample_freq = term->val.freq; + attr->freq =1 ; +break ;case PERF_EVSEL__CONFIG_TERM_TIME :if (term->val.time)perf_evsel__set_sample_bit (evsel,TIME );
tools/perf/util/evsel.h +2 -0
@@ -39,6 +39,7 @@ struct cgroup_sel;*/ enum {PERF_EVSEL__CONFIG_TERM_PERIOD , +PERF_EVSEL__CONFIG_TERM_FREQ ,PERF_EVSEL__CONFIG_TERM_TIME ,PERF_EVSEL__CONFIG_TERM_MAX , };
@@ -48,6 +49,7 @@ struct perf_evsel_config_term {int type;union {u64 period; +u64 freq;bool time; } val; };
tools/perf/util/parse-events.c +6 -0
@@ -597,6 +597,9 @@ do { \case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD :CHECK_TYPE_VAL (NUM );break ; +case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ : +CHECK_TYPE_VAL (NUM ); +break ;case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE :/* * TODO uncomment when the field is available
@@ -659,6 +662,9 @@ do { \case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD :ADD_CONFIG_TERM (PERIOD , period, term->val.num);break ; +case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ : +ADD_CONFIG_TERM (FREQ , freq, term->val.num); +break ;case PARSE_EVENTS__TERM_TYPE_TIME :ADD_CONFIG_TERM (TIME , time, term->val.num);break ;
tools/perf/util/parse-events.h +1 -0
@@ -62,6 +62,7 @@ enum {PARSE_EVENTS__TERM_TYPE_CONFIG2 ,PARSE_EVENTS__TERM_TYPE_NAME ,PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD , +PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ ,PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE , PARSE_EVENTS__TERM_TYPE_TIME, };
tools/perf/util/parse-events.l +1 -0
@@ -182,6 +182,7 @@ config1 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); } config2 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); } name { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); } period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } +freq { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ); } branch_type { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } time { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_TIME); } , { return ','; }
tools/perf/util/pmu.c +1 -1
@@ -634,7 +634,7 @@ static char *formats_error_string(struct list_head *formats) {struct perf_pmu_format *format;char *err, *str; -static const char *static_terms ="config,config1,config2,name,period,branch_type,time\n" ; +static const char *static_terms ="config,config1,config2,name,period,freq,branch_type,time\n" ;unsigned i =0 ;if (!asprintf (&str,"valid terms:" ))
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 9/9 perf evlist: Be more specific on -F/--freq
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
Currently perf evlist -F shows the number as if it's always sampling frequency. But we now support per-event freq/period settings. So it'd better to show more detailed info whether it's freq or period.
$ perf record -e 'cpu/config=1/,cpu/config=2,period=300000/' sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.017 MB perf.data ]
$ perf evlist -F cpu/config=1/: sample_freq=4000 cpu/config=2,period=300000/: sample_period=300000
--- tools/perf/util/evsel.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
tools/perf/util/evsel.c +7 -2
@@ -2158,8 +2158,13 @@ int perf_evsel__fprintf(struct perf_evsel *evsel, printed +=perf_event_attr__fprintf (fp, &evsel->attr, __print_attr__fprintf, &first); }else if (details->freq) { - printed +=comma_fprintf (fp, &first," sample_freq=%" PRIu64, - (u64 )evsel->attr.sample_freq); +const char *term ="sample_freq" ; + +if (!evsel->attr.freq) + term ="sample_period" ; + + printed +=comma_fprintf (fp, &first," %s=%" PRIu64, + term, (u64 )evsel->attr.sample_freq); } out:fputc ('\n' , fp);
Signature · 1 line
2.1.0
Quoted 102 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
f1d800bf615b84ca253af372d2dac8cdef743a20:Merge tag 'perf-ebpf-for-mingo' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/core (2015-08-08 10:05:17 +0200)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingofor you to fetch changes up to
4605bb55b91449a1a953a51f0334d3bc02351adb:perf evlist: Be more specific on -F/--freq (2015-08-10 17:20:26 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:User visible:
- Introduce 'srcfile' sort key: (Andi Kleen)
# perf record -F 10000 usleep 1 # perf report --stdio --dsos '[kernel.vmlinux]' -s srcfile <SNIP> # Overhead Source File 26.49% copy_page_64.S 5.49% signal.c 0.51% msr.h #It can be combined with other fields, for instance, experiment with '-s srcfile,symbol'.
There are some oddities in some distros and with some specific DSOs, being investigated, so your mileage may vary.
- Update the column width for the "srcline" sort key (Arnaldo Carvalho de Melo)
- Support per-event 'freq' term: (Namhyung Kim)
$ perf record -e 'cpu/instructions,freq=1234/',cycles -c 1000 sleep 1 $ perf evlist -F cpu/instructions,freq=1234/: sample_freq=1234 cycles: sample_period=1000 $Infrastructure:
- Move
perf_countsstruct and functions into separate object (Jiri Olsa)- Unset
perf_event_attr::freqwhen period term is set (Jiri Olsa)- Move callchain option parsing code to
util.c(Kan Liang)Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Andi Kleen (2):
perf tools: Support full source file paths for srcline perf report: Add support for srcfile sort keyArnaldo Carvalho de Melo (2):
perf hists:hist_entry__cmp()may use he_tmp.hists, initialize it perf hists: Update the column width for the "srcline" sort keyJiri Olsa (2):
perf stat: Moveperf_countsstruct and functions into separate object perf tools: Unsetperf_event_attr::freqwhen period term is setKan Liang (1):
perf callchain: Move option parsing code toutil.cNamhyung Kim (2):
perf record: Support per-event freq term
perf evlist: Be more specific on -F/--freqtools/perf/Documentation/perf-record.txt | 1 + tools/perf/Documentation/perf-report.txt | 4 ++ tools/perf/Documentation/perf-script.txt | 3 ++ tools/perf/builtin-report.c | 2 + tools/perf/builtin-script.c | 2 + tools/perf/builtin-stat.c | 1 + tools/perf/util/Build | 1 + tools/perf/util/callchain.c | 89 +------------------------------ tools/perf/util/callchain.h | 1 + tools/perf/util/counts.c | 52 ++++++++++++++++++ tools/perf/util/counts.h | 37 +++++++++++++ tools/perf/util/evsel.c | 14 ++++- tools/perf/util/evsel.h | 4 +- tools/perf/util/hist.c | 9 ++++ tools/perf/util/hist.h | 1 + tools/perf/util/parse-events.c | 6 +++ tools/perf/util/parse-events.h | 1 + tools/perf/util/parse-events.l | 1 + tools/perf/util/pmu.c | 2 +- tools/perf/util/python-ext-sources | 2 +- tools/perf/util/sort.c | 52 ++++++++++++++++++ tools/perf/util/sort.h | 2 +
Quoted 8 lines
tools/perf/util/srcline.c | 6 ++- tools/perf/util/stat.c | 49 ----------------- tools/perf/util/stat.h | 30 ----------- tools/perf/util/util.c | 90 ++++++++++++++++++++++++++++++++ tools/perf/util/util.h | 3 ++ 27 files changed, 292 insertions(+), 173 deletions(-) create mode 100644 tools/perf/util/counts.c create mode 100644 tools/perf/util/counts.h
Pulled, thanks a lot Arnaldo!
Ingo