perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit 9243ae5b28d02dc7d71a4f00c981ef6feaede3f1:
Merge tag 'perf-core-for-mingo-20160415' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2016-04-16 11:09:57 +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-20160419
for you to fetch changes up to 6566feafb4dba4eef30a9c0b25e6f49f996178b6:
perf test: Add missing verbose output explaining the reason for failure (2016-04-19 12:39:36 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
Build fixes:
- Fix 'perf trace' build when DWARF unwind isn't available (Arnaldo Carvalho de Melo)
- Remove x86 references from arch-neutral Build, fixing it in !x86 arches, reported as breaking the build for powerpc64le in linux-next (Arnaldo Carvalho de Melo)
Infrastructure:
- Do memset() variable 'st' using the correct size in the jit code (Colin Ian King)
- Fix postgresql ubuntu 'perf script' install instructions (Chris Phlipot)
- Use callchain_param more thoroughly when checking how callchains were configured, eventually will be the only way to look for callchain parameters (Arnaldo Carvalho de Melo)
- Fix some issues in the 'perf test kallsyms' entry (Arnaldo Carvalho de Melo)
----------------------------------------------------------------
Arnaldo Carvalho de Melo (12):
perf trace: Fix build when DWARF unwind isn't available
perf evsel: Add missign class prefix to has_branch_stack method perf script: Check sample->callchain before using it
perf callchain: Set callchain_param.enabled when parsing --call-graph perf report: Use callchain_param.enabled instead of tool specific knob perf tools: Ditch record_opts.callgraph_set
perf hists browser: Fold two consecutive symbol_conf.use_callchain ifs perf top: Use callchain_param.enabled instead of symbol_conf.use_callchain perf build: Remove x86 references from arch-neutral Build perf symbols: Allow loading kallsyms without considering kcore files perf test: Ignore kcore files in the "vmlinux matches kallsyms" test perf test: Add missing verbose output explaining the reason for failure
Chris Phlipot (1):
perf script: Fix postgresql ubuntu install instructions
Colin Ian King (1):
perf jit: memset() variable 'st' using the correct size
tools/perf/builtin-record.c | 14 ++++++------- tools/perf/builtin-report.c | 11 +++++----- tools/perf/builtin-script.c | 2 +- tools/perf/builtin-top.c | 25 +++++++++++------------ tools/perf/builtin-trace.c | 10 ++++----- tools/perf/perf.h | 1 - tools/perf/scripts/python/export-to-postgresql.py | 5 ++--- tools/perf/tests/vmlinux-kallsyms.c | 11 +++++++++- tools/perf/ui/browsers/hists.c | 5 ++--- tools/perf/util/Build | 4 ---- tools/perf/util/callchain.c | 2 ++ tools/perf/util/evsel.h | 2 +- tools/perf/util/jitdump.c | 4 ++-- tools/perf/util/machine.c | 14 +++++++++---- tools/perf/util/machine.h | 2 ++ tools/perf/util/session.c | 4 ++-- tools/perf/util/symbol.c | 12 ++++++++--- tools/perf/util/symbol.h | 2 ++ 18 files changed, 74 insertions(+), 56 deletions(-)
Arnaldo Carvalho de Melo
maintainerPATCH 1/14 perf trace: Fix build when DWARF unwind isn't available
From: Arnaldo Carvalho de Melo <[email protected]>
The variable is initialized and then conditionally set to a different value, but not used when DWARF unwinding is not available, bummer, write 1000 times: "Run make -C tools/perf build-test"...
builtin-trace.c: In function ‘cmd_trace’:
builtin-trace.c:3112:6: error: variable ‘max_stack_user_set’ set but not used [-Werror=unused-but-set-variable]
bool max_stack_user_set = true;
^cc1: all warnings being treated as err
Fix it by marking it as __maybe_unused.
--- tools/perf/builtin-trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-trace.c +1 -1
@@ -3109,7 +3109,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) "per thread proc mmap processing timeout in ms"), OPT_END() }; -bool max_stack_user_set = true; +bool __maybe_unused max_stack_user_set = true;bool mmap_pages_user_set = true;const char *const trace_subcommands[] = {"record" ,NULL };int err;
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 2/14 perf evsel: Add missign class prefix to has_branch_stack method
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/evsel.h | 2 +- tools/perf/util/machine.c | 2 +- tools/perf/util/session.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-)
tools/perf/util/evsel.h +1 -1
@@ -420,7 +420,7 @@ for ((_evsel) = list_entry((_leader)->node.next, struct perf_evsel, node); \ (_evsel ) && (_evsel)->leader == (_leader); \ (_evsel) = list_entry((_evsel)->node.next, struct perf_evsel, node)) -static inline bool has_branch_callstack (struct perf_evsel *evsel) +static inline bool perf_evsel__has_branch_callstack (const struct perf_evsel *evsel) {return evsel->attr.branch_sample_type &PERF_SAMPLE_BRANCH_CALL_STACK ; }
tools/perf/util/machine.c +1 -1
@@ -1808,7 +1808,7 @@ static int thread__resolve_callchain_sample(struct thread *thread,callchain_cursor_reset (cursor); -if (has_branch_callstack (evsel)) { +if (perf_evsel__has_branch_callstack (evsel)) { err =resolve_lbr_callchain_sample (thread, cursor, sample, parent, root_al, max_stack);if (err)
tools/perf/util/session.c +2 -2
@@ -907,7 +907,7 @@ static void callchain__printf(struct perf_evsel *evsel,unsigned int i;struct ip_callchain *callchain = sample->callchain; -if (has_branch_callstack (evsel)) +if (perf_evsel__has_branch_callstack (evsel))callchain__lbr_callstack_printf (sample);printf ("... FP chain: nr:%" PRIu64"\n" , callchain->nr);
@@ -1081,7 +1081,7 @@ static void dump_sample(struct perf_evsel *evsel, union perf_event *event,if (sample_type &PERF_SAMPLE_CALLCHAIN )callchain__printf (evsel, sample); -if ((sample_type &PERF_SAMPLE_BRANCH_STACK ) && !has_branch_callstack (evsel)) +if ((sample_type &PERF_SAMPLE_BRANCH_STACK ) && !perf_evsel__has_branch_callstack (evsel))branch_stack__printf (sample);if (sample_type &PERF_SAMPLE_REGS_USER )
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 3/14 perf script: Check sample->callchain before using it
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Found by code inspection, while looking at thread__resolve_callchain() callsites, one had it, the other didn't.
--- tools/perf/builtin-script.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-script.c +1 -1
@@ -791,7 +791,7 @@ static void process_event(struct perf_script *script,if (PRINT_FIELD (IP )) {struct callchain_cursor *cursor =NULL , cursor_callchain; -if (symbol_conf.use_callchain && +if (symbol_conf.use_callchain && sample->callchain &&thread__resolve_callchain (al->thread, &cursor_callchain, evsel, sample,NULL ,NULL , scripting_max_stack) ==0 ) cursor = &cursor_callchain;
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 4/14 perf callchain: Set callchain_param.enabled when parsing --call-graph
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Trying to move in the direction of using callchain_param for all callchain parameters, eventually ditching them from symbol_conf.
--- tools/perf/util/callchain.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/callchain.c +2 -0
@@ -109,6 +109,7 @@ __parse_callchain_report_opt(const char *arg, bool allow_record_opt)bool record_opt_set = false;bool try_stack_size = false; + callchain_param.enabled = true; symbol_conf.use_callchain = true;if (!arg)
@@ -117,6 +118,7 @@ __parse_callchain_report_opt(const char *arg, bool allow_record_opt)while ((tok =strtok ((char *)arg,"," )) !=NULL ) {if (!strncmp (tok,"none" ,strlen (tok))) { callchain_param.mode =CHAIN_NONE ; + callchain_param.enabled = false; symbol_conf.use_callchain = false;return 0 ; }
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 5/14 perf report: Use callchain_param.enabled instead of tool specific knob
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
We have callchain_param.enabled, so no need to have something just for 'perf report' to do the same thing.
--- tools/perf/builtin-report.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
tools/perf/builtin-report.c +6 -5
@@ -47,7 +47,6 @@ struct report {struct perf_tool tool;struct perf_session *session;bool use_tui, use_gtk, use_stdio; -bool dont_use_callchains;bool show_full_info;bool show_threads;bool inverted_callchain;
@@ -247,7 +246,7 @@ static int report__setup_sample_type(struct report *rep) "you call 'perf record' without -g?\n");return -1 ; } - }else if (!rep->dont_use_callchains && + }else if (!callchain_param.enabled && callchain_param.mode !=CHAIN_NONE && !symbol_conf.use_callchain) { symbol_conf.use_callchain = true;
@@ -599,13 +598,15 @@ static int __cmd_report(struct report *rep)static int report_parse_callchain_opt (const struct option *opt,const char *arg,int unset) { -struct report *rep = (struct report *)opt->value; +struct callchain_param *callchain = opt->value; + callchain->enabled = !unset;/* * --no-call-graph */ if (unset) { - rep->dont_use_callchains = true; + symbol_conf.use_callchain = false; + callchain->mode =CHAIN_NONE ;return 0 ; }
@@ -734,7 +735,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) "regex filter to identify parent, see: '--sort parent'"),OPT_BOOLEAN ('x' ,"exclude-other" , &symbol_conf.exclude_other,"Only display entries with parent-match" ), -OPT_CALLBACK_DEFAULT ('g' ,"call-graph" , &report, +OPT_CALLBACK_DEFAULT ('g' ,"call-graph" , &callchain_param,"print_type,threshold[,print_limit],order,sort_key[,branch],value" , report_callchain_help, &report_parse_callchain_opt, callchain_default_opt),
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 6/14 perf tools: Ditch record_opts.callgraph_set
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
We have callchain_param.enabled for that.
--- tools/perf/builtin-record.c | 14 ++++++-------- tools/perf/builtin-top.c | 13 ++++++------- tools/perf/builtin-trace.c | 8 ++++---- tools/perf/perf.h | 1 - 4 files changed, 16 insertions(+), 20 deletions(-)
tools/perf/builtin-record.c +6 -8
@@ -946,7 +946,6 @@ int record_opts__parse_callchain(struct record_opts *record, const char *arg, bool unset) { int ret; - record->callgraph_set = true; callchain->enabled = !unset;/* --no-call-graph */
@@ -978,15 +977,14 @@ int record_callchain_opt(const struct option *opt, const char *arg __maybe_unused, int unset __maybe_unused) { -struct record_opts *record = (struct record_opts *)opt->value; +struct callchain_param *callchain = opt->value; - record->callgraph_set = true; - callchain_param.enabled = true; + callchain->enabled = true; -if (callchain_param.record_mode ==CALLCHAIN_NONE ) - callchain_param.record_mode =CALLCHAIN_FP ; +if (callchain->record_mode ==CALLCHAIN_NONE ) + callchain->record_mode =CALLCHAIN_FP ; -callchain_debug (&callchain_param); +callchain_debug (callchain);return 0 ; }
@@ -1224,7 +1222,7 @@ struct option __record_options[] = { record__parse_mmap_pages),OPT_BOOLEAN (0 ,"group" , &record.opts.group,"put the counters into a counter group" ), -OPT_CALLBACK_NOOPT ('g' ,NULL , &record.opts, +OPT_CALLBACK_NOOPT ('g' ,NULL , &callchain_param,NULL ,"enables call-graph recording" , &record_callchain_opt), OPT_CALLBACK(0, "call-graph", &record.opts,
tools/perf/builtin-top.c +6 -7
@@ -1045,18 +1045,17 @@ callchain_opt(const struct option *opt, const char *arg, int unset)static int parse_callchain_opt (const struct option *opt,const char *arg,int unset) { -struct record_opts *record = (struct record_opts *)opt->value; +struct callchain_param *callchain = opt->value; - record->callgraph_set = true; - callchain_param.enabled = !unset; - callchain_param.record_mode =CALLCHAIN_FP ; + callchain->enabled = !unset; + callchain->record_mode =CALLCHAIN_FP ;/* * --no-call-graph */ if (unset) { symbol_conf.use_callchain = false; - callchain_param.record_mode =CALLCHAIN_NONE ; + callchain->record_mode =CALLCHAIN_NONE ;return 0 ; }
@@ -1162,10 +1161,10 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) "output field(s): overhead, period, sample plus all of sort keys"),OPT_BOOLEAN ('n' ,"show-nr-samples" , &symbol_conf.show_nr_samples,"Show a column with the number of samples" ), -OPT_CALLBACK_NOOPT ('g' ,NULL , &top.record_opts, +OPT_CALLBACK_NOOPT ('g' ,NULL , &callchain_param,NULL ,"enables call-graph recording and display" , &callchain_opt), -OPT_CALLBACK (0 ,"call-graph" , &top.record_opts, +OPT_CALLBACK (0 ,"call-graph" , &callchain_param,"record_mode[,record_size],print_type,threshold[,print_limit],order,sort_key[,branch]" , top_callchain_help, &parse_callchain_opt), OPT_BOOLEAN(0, "children", &symbol_conf.cumulate_callchain,
tools/perf/builtin-trace.c +4 -4
@@ -2457,7 +2457,7 @@ static int trace__add_syscall_newtp(struct trace *trace)perf_evlist__add (evlist, sys_enter);perf_evlist__add (evlist, sys_exit); -if (trace->opts.callgraph_set && !trace->kernel_syscallchains) { +if (callchain_param.enabled && !trace->kernel_syscallchains) {/* * We're interested only in the user space callchain * leading to the syscall, allow overriding that for
@@ -2546,7 +2546,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)perf_evlist__config (evlist, &trace->opts,NULL ); -if (trace->opts.callgraph_set && trace->syscalls.events.sys_exit) { +if (callchain_param.enabled && trace->syscalls.events.sys_exit) {perf_evsel__config_callchain (trace->syscalls.events.sys_exit, &trace->opts, &callchain_param);/*
@@ -3153,11 +3153,11 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused) }#ifdef HAVE_DWARF_UNWIND_SUPPORT -if ((trace.min_stack || max_stack_user_set) && !trace.opts.callgraph_set) +if ((trace.min_stack || max_stack_user_set) && !callchain_param.enabled)record_opts__parse_callchain (&trace.opts, &callchain_param,"dwarf" , false);#endif -if (trace.opts.callgraph_set) { +if (callchain_param.enabled) {if (!mmap_pages_user_set &&geteuid () ==0 ) trace.opts.mmap_pages =perf_event_mlock_kb_in_pages () *4 ;
tools/perf/perf.h +0 -1
@@ -52,7 +52,6 @@ struct record_opts {bool sample_weight;bool sample_time;bool sample_time_set; -bool callgraph_set;bool period;bool running_time;bool full_auxtrace;
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 7/14 perf hists browser: Fold two consecutive symbol_conf.use_callchain ifs
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/ui/browsers/hists.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
tools/perf/ui/browsers/hists.c +2 -3
@@ -1896,11 +1896,10 @@ static int hist_browser__fprintf_entry(struct hist_browser *browser,bool first = true;int ret; -if (symbol_conf.use_callchain) +if (symbol_conf.use_callchain) { folded_sign =hist_entry__folded (he); - -if (symbol_conf.use_callchain) printed +=fprintf (fp,"%c " , folded_sign); + }hists__for_each_format (browser->hists, fmt) {if (perf_hpp__should_skip (fmt, he->hists))
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 8/14 perf top: Use callchain_param.enabled instead of symbol_conf.use_callchain
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
One more step in the direction of using just callchain_param for callchain parameters.
--- tools/perf/builtin-top.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/perf/builtin-top.c +6 -6
@@ -917,15 +917,15 @@ out_err:return -1 ; } -static int perf_top__setup_sample_type (struct perf_top *top__maybe_unused ) +static int callchain_param__setup_sample_type (struct callchain_param *callchain) {if (!sort__has_sym) { -if (symbol_conf.use_callchain) { +if (callchain->enabled) {ui__error ("Selected -g but \"sym\" not present in --sort/-s." );return -EINVAL ; } - }else if (callchain_param.mode !=CHAIN_NONE ) { -if (callchain_register_param (&callchain_param) <0 ) { + }else if (callchain->mode !=CHAIN_NONE ) { +if (callchain_register_param (callchain) <0 ) {ui__error ("Can't register callchain params.\n" );return -EINVAL ; }
@@ -952,7 +952,7 @@ static int __cmd_top(struct perf_top *top) goto out_delete; } - ret =perf_top__setup_sample_type (top); + ret =callchain_param__setup_sample_type (&callchain_param);if (ret) goto out_delete;
@@ -1311,7 +1311,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused) top.sym_evsel =perf_evlist__first (top.evlist); -if (!symbol_conf.use_callchain) { +if (!callchain_param.enabled) { symbol_conf.cumulate_callchain = false;perf_hpp__cancel_cumulate (); }
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 9/14 perf script: Fix postgresql ubuntu install instructions
In reply to Arnaldo Carvalho de MeloFrom: Chris Phlipot <[email protected]>
The current instructions for setting up an Ubuntu system for using the export-to-postgresql.py script are incorrect.
The instructions in the script have been updated to work on newer versions of ubuntu.
-Add missing dependencies to apt-get command:
python-pyside.qtsql, libqt4-sql-psql
-Add '-s' option to createuser command to force the user to be a
superuser since the command doesn't prompt as indicated in the current instructions.
Tested on: Ubuntu 14.04, Ubuntu 16.04(beta)
--- tools/perf/scripts/python/export-to-postgresql.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
tools/perf/scripts/python/export-to-postgresql.py +2 -3
@@ -34,10 +34,9 @@ import datetime # # ubuntu: # -# $ sudo apt-get install postgresql +# $ sudo apt-get install postgresql python-pyside.qtsql libqt4-sql-psql # $ sudo su - postgres -# $ createuser <your user id here> -# Shall the new role be a superuser? (y/n) y +# $ createuser -s <your user id here> # # An example of using this script with Intel PT: #
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 10/14 perf jit: memset() variable 'st' using the correct size
In reply to Arnaldo Carvalho de MeloFrom: Colin Ian King <[email protected]>
The current code is memsetting the 'struct stat' variable 'st' with the size of 'stat' (which turns out to be 1 byte) rather than the size of variable 'sz'.
Committer notes:
sizeof(function) isn't valid, the result depends on the compiler used, with gcc, enabling pedantic warnings we get:
$ cat sizeof_function.c #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h>
int main(void)
{
printf("sizeof(stat)=%zd, stat=%p\n", sizeof(stat), stat);
return 0;
}
$ readelf -sW sizeof_function | grep -w stat
49: 0000000000400630 16 FUNC WEAK HIDDEN 13 stat
$ cc -pedantic sizeof_function.c -o sizeof_function
sizeof_function.c: In function ‘main’:
sizeof_function.c:8:46: warning: invalid application of ‘sizeof’ to a function type [-Wpointer-arith]
printf("sizeof(stat)=%zd, stat=%p\n", sizeof(stat), stat);
^
$ ./sizeof_function
sizeof(stat)=1, stat=0x400630
$Standard C, section 6.5.3.4:
"The sizeof operator shall not be applied to an expression that has function
type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member."
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
--- tools/perf/util/jitdump.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/jitdump.c +2 -2
@@ -412,7 +412,7 @@ static int jit_repipe_code_load(struct jit_buf_desc *jd, union jr_entry *jr)return -1 ; }if (stat (filename, &st)) -memset (&st,0 ,sizeof (stat)); +memset (&st,0 ,sizeof (st)); event->mmap2.header.type =PERF_RECORD_MMAP2 ; event->mmap2.header.misc =PERF_RECORD_MISC_USER ;
@@ -500,7 +500,7 @@ static int jit_repipe_code_move(struct jit_buf_desc *jd, union jr_entry *jr) size++;/* for \0 */ if (stat (filename, &st)) -memset (&st,0 ,sizeof (stat)); +memset (&st,0 ,sizeof (st)); size =PERF_ALIGN (size,sizeof (u64));
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 11/14 perf build: Remove x86 references from arch-neutral Build
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
It will already be dealt with generating the syscalltbl.c file in the x86 arch specific Build files, namely via 'archheaders'.
This fixes the build on !x86 arches, as reported for powerpcle
--- tools/perf/util/Build | 4 ---- 1 file changed, 4 deletions(-)
tools/perf/util/Build +0 -4
@@ -150,10 +150,6 @@ CFLAGS_libstring.o += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ET CFLAGS_hweight.o += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))" CFLAGS_parse-events.o += -Wno-redundant-decls -$(OUTPUT)util/syscalltbl.o: util/syscalltbl.c arch/x86/entry/syscalls/syscall_64.tbl $(OUTPUT)arch/x86/include/generated/asm/syscalls_64.c FORCE - $(call rule_mkdir) - $(call if_changed_dep,cc_o_c) - $(OUTPUT)util/kallsyms.o: ../lib/symbol/kallsyms.c FORCE $(call rule_mkdir) $(call if_changed_dep,cc_o_c)
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 12/14 perf symbols: Allow loading kallsyms without considering kcore files
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Before the support for using /proc/kcore was introduced, the kallsyms routines used /proc/modules and the first 'perf test' entry expected finding maps for each module in the system, which is not the case with the kcore code. Provide a way to ignore kcore files so that the test can have its expectations met.
Improving the test to cover kcore files as well needs to be done.
--- tools/perf/util/machine.c | 12 +++++++++--- tools/perf/util/machine.h | 2 ++ tools/perf/util/symbol.c | 12 +++++++++--- tools/perf/util/symbol.h | 2 ++ 4 files changed, 22 insertions(+), 6 deletions(-)
tools/perf/util/machine.c +9 -3
@@ -908,11 +908,11 @@ int machines__create_kernel_maps(struct machines *machines, pid_t pid)return machine__create_kernel_maps (machine); } -int machine__load_kallsyms (struct machine *machine,const char *filename, -enum map_type type,symbol_filter_t filter) +int __machine__load_kallsyms (struct machine *machine,const char *filename, +enum map_type type,bool no_kcore,symbol_filter_t filter) {struct map *map =machine__kernel_map (machine); -int ret =dso__load_kallsyms (map->dso, filename, map, filter); +int ret =__dso__load_kallsyms (map->dso, filename, map, no_kcore, filter);if (ret >0 ) {dso__set_loaded (map->dso, type);
@@ -927,6 +927,12 @@ int machine__load_kallsyms(struct machine *machine, const char *filename,return ret; } +int machine__load_kallsyms (struct machine *machine,const char *filename, +enum map_type type,symbol_filter_t filter) +{ +return __machine__load_kallsyms (machine, filename, type, false, filter); +} +int machine__load_vmlinux_path (struct machine *machine,enum map_type type,symbol_filter_t filter) {
tools/perf/util/machine.h +2 -0
@@ -215,6 +215,8 @@ struct symbol *machine__find_kernel_function_by_name(struct machine *machine,struct map *machine__findnew_module_map (struct machine *machine,u64 start,const char *filename); +int __machine__load_kallsyms (struct machine *machine,const char *filename, +enum map_type type,bool no_kcore,symbol_filter_t filter);int machine__load_kallsyms (struct machine *machine,const char *filename,enum map_type type,symbol_filter_t filter); int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
tools/perf/util/symbol.c +9 -3
@@ -1208,8 +1208,8 @@ static int kallsyms__delta(struct map *map, const char *filename, u64 *delta)return 0 ; } -int dso__load_kallsyms (struct dso *dso,const char *filename, -struct map *map,symbol_filter_t filter) +int __dso__load_kallsyms (struct dso *dso,const char *filename, +struct map *map,bool no_kcore,symbol_filter_t filter) {u64 delta =0 ;
@@ -1230,12 +1230,18 @@ int dso__load_kallsyms(struct dso *dso, const char *filename,else dso->symtab_type =DSO_BINARY_TYPE__KALLSYMS ; -if (!dso__load_kcore (dso, map, filename)) +if (!no_kcore && !dso__load_kcore (dso, map, filename))return dso__split_kallsyms_for_kcore (dso, map, filter);else return dso__split_kallsyms (dso, map, delta, filter); } +int dso__load_kallsyms (struct dso *dso,const char *filename, +struct map *map,symbol_filter_t filter) +{ +return __dso__load_kallsyms (dso, filename, map, false, filter); +} +static int dso__load_perf_map (struct dso *dso,struct map *map,symbol_filter_t filter) {
tools/perf/util/symbol.h +2 -0
@@ -240,6 +240,8 @@ int dso__load_vmlinux(struct dso *dso, struct map *map, symbol_filter_t filter);int dso__load_vmlinux_path (struct dso *dso,struct map *map,symbol_filter_t filter); +int __dso__load_kallsyms (struct dso *dso,const char *filename,struct map *map, +bool no_kcore,symbol_filter_t filter);int dso__load_kallsyms (struct dso *dso,const char *filename,struct map *map,symbol_filter_t filter);
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 13/14 perf test: Ignore kcore files in the "vmlinux matches kallsyms" test
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Before:
# perf test -v kallsyms <SNIP> Maps only in vmlinux: ffffffff81d5e000-ffffffff81ec3ac8 115e000 [kernel].init.text ffffffff81ec3ac8-ffffffffa0000000 12c3ac8 [kernel].exit.text ffffffffa0000000-ffffffffa000c000 0 [fjes] ffffffffa000c000-ffffffffa0017000 0 [video] ffffffffa0017000-ffffffffa001c000 0 [grace] <SNIP> ffffffffa0a7f000-ffffffffa0ba5000 0 [xfs] ffffffffa0ba5000-ffffffffffffffff 0 [veth] Maps in vmlinux with a different name in kallsyms: Maps only in kallsyms: ffff880000100000-ffff88001000b000 80000103000 [kernel.kallsyms] ffff88001000b000-ffff880100000000 8001000e000 [kernel.kallsyms] ffff880100000000-ffffc90000000000 80100003000 [kernel.kallsyms] <SNIP> ffffffffa0000000-ffffffffff600000 7fffa0003000 [kernel.kallsyms] ffffffffff600000-ffffffffffffffff 7fffff603000 [kernel.kallsyms] test child finished with -1 ---- end ---- vmlinux symtab matches kallsyms: FAILED! #
After:
# perf test -v 1 1: vmlinux symtab matches kallsyms : --- start --- test child forked, pid 7058 Looking at the vmlinux_path (8 entries long) Using /lib/modules/4.6.0-rc1+/build/vmlinux for symbols 0xffffffff81076870: diff end addr for aesni_gcm_dec v: 0xffffffff810791f2 k: 0xffffffff81076902 0xffffffff81079200: diff end addr for aesni_gcm_enc v: 0xffffffff8107bb03 k: 0xffffffff81079292 0xffffffff8107e8d0: diff end addr for aesni_gcm_enc_avx_gen2 v: 0xffffffff81083e76 k: 0xffffffff8107e943 0xffffffff81083e80: diff end addr for aesni_gcm_dec_avx_gen2 v: 0xffffffff81089611 k: 0xffffffff81083ef3 0xffffffff81089990: diff end addr for aesni_gcm_enc_avx_gen4 v: 0xffffffff8108e7c4 k: 0xffffffff81089a03 0xffffffff8108e7d0: diff end addr for aesni_gcm_dec_avx_gen4 v: 0xffffffff810937ef k: 0xffffffff8108e843 Maps only in vmlinux: ffffffff81d5e000-ffffffff81ec3ac8 115e000 [kernel].init.text ffffffff81ec3ac8-ffffffffa0000000 12c3ac8 [kernel].exit.text Maps in vmlinux with a different name in kallsyms: Maps only in kallsyms: test child finished with -1 ---- end ---- vmlinux symtab matches kallsyms: FAILED! #
--- tools/perf/tests/vmlinux-kallsyms.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
tools/perf/tests/vmlinux-kallsyms.c +7 -1
@@ -54,8 +54,14 @@ int test__vmlinux_matches_kallsyms(int subtest __maybe_unused)* Step 3: * * Load and split /proc/kallsyms into multiple maps, one per module. +* Do not use kcore, as this test was designed before kcore support +* and has parts that only make sense if using the non-kcore code. +* XXX: extend it to stress the kcorre code as well, hint: the list +* of modules extracted from /proc/kcore, in its current form, can't +* be compacted against the list of modules found in the "vmlinux" +* code and with the one got from /proc/modules from the "kallsyms" code. */ -if (machine__load_kallsyms (&kallsyms,"/proc/kallsyms" , type,NULL ) <=0 ) { +if (__machine__load_kallsyms (&kallsyms,"/proc/kallsyms" , type, true,NULL ) <=0 ) {pr_debug ("dso__load_kallsyms " ); goto out; }
Signature · 1 line
2.5.5
Arnaldo Carvalho de Melo
maintainerPATCH 14/14 perf test: Add missing verbose output explaining the reason for failure
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
One of the branches leading to an error had no debug message emitted, fix it, the new lines are:
# perf test -v kallsyms <SNIP> 0xffffffff81001000: diff name v: xen_hypercall_set_trap_table k: hypercall_page 0xffffffff810691f0: diff name v: try_to_free_pud_page k: try_to_free_pmd_page <SNIP> 0xffffffff8150bb20: diff name v: wakeup_expire_count_show.part.5 k: wakeup_active_count_show.part.7 0xffffffff816bc7f0: diff name v: phys_switch_id_show.part.11 k: phys_port_name_show.part.12 0xffffffff817bbb90: diff name v: __do_softirq k: __softirqentry_text_start <SNIP>
This in turn exercises another bug, still under investigation, because those aliases _are_ in kallsyms, with the same name...
--- tools/perf/tests/vmlinux-kallsyms.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/tests/vmlinux-kallsyms.c +3 -0
@@ -163,6 +163,9 @@ next_pair:pr_debug ("%#" PRIx64": diff name v: %s k: %s\n" , mem_start, sym->name, pair->name); + }else { +pr_debug ("%#" PRIx64": diff name v: %s k: %s\n" , + mem_start, sym->name, first_pair->name); } } }else
Signature · 1 line
2.5.5
Quoted 75 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
9243ae5b28d02dc7d71a4f00c981ef6feaede3f1:Merge tag 'perf-core-for-mingo-20160415' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/core (2016-04-16 11:09:57 +0200)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-20160419for you to fetch changes up to
6566feafb4dba4eef30a9c0b25e6f49f996178b6:perf test: Add missing verbose output explaining the reason for failure (2016-04-19 12:39:36 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:Build fixes:
- Fix 'perf trace' build when DWARF unwind isn't available (Arnaldo Carvalho de Melo)
- Remove x86 references from arch-neutral Build, fixing it in !x86 arches, reported as breaking the build for powerpc64le in linux-next (Arnaldo Carvalho de Melo)
Infrastructure:
- Do
memset()variable 'st' using the correct size in the jit code (Colin Ian King)- Fix postgresql ubuntu 'perf script' install instructions (Chris Phlipot)
- Use
callchain_parammore thoroughly when checking how callchains were configured, eventually will be the only way to look for callchain parameters (Arnaldo Carvalho de Melo)- Fix some issues in the 'perf test kallsyms' entry (Arnaldo Carvalho de Melo)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (12):
perf trace: Fix build when DWARF unwind isn't available
perf evsel: Add missign class prefix tohas_branch_stackmethod perf script: Checksample->callchainbefore using it
perf callchain: Set callchain_param.enabled when parsing --call-graph perf report: Use callchain_param.enabled instead of tool specific knob perf tools: Ditch record_opts.callgraph_set
perf hists browser: Fold two consecutive symbol_conf.use_callchain ifs perf top: Use callchain_param.enabled instead of symbol_conf.use_callchain perf build: Remove x86 references from arch-neutral Build perf symbols: Allow loading kallsyms without considering kcore files perf test: Ignore kcore files in the "vmlinux matches kallsyms" test perf test: Add missing verbose output explaining the reason for failureChris Phlipot (1):
perf script: Fix postgresql ubuntu install instructionsColin Ian King (1):
perf jit:memset()variable 'st' using the correct sizetools/perf/builtin-record.c | 14 ++++++------- tools/perf/builtin-report.c | 11 +++++----- tools/perf/builtin-script.c | 2 +- tools/perf/builtin-top.c | 25 +++++++++++------------ tools/perf/builtin-trace.c | 10 ++++----- tools/perf/perf.h | 1 - tools/perf/scripts/python/export-to-postgresql.py | 5 ++--- tools/perf/tests/vmlinux-kallsyms.c | 11 +++++++++- tools/perf/ui/browsers/hists.c | 5 ++--- tools/perf/util/Build | 4 ---- tools/perf/util/callchain.c | 2 ++
Quoted 8 lines
tools/perf/util/evsel.h | 2 +- tools/perf/util/jitdump.c | 4 ++-- tools/perf/util/machine.c | 14 +++++++++---- tools/perf/util/machine.h | 2 ++ tools/perf/util/session.c | 4 ++-- tools/perf/util/symbol.c | 12 ++++++++--- tools/perf/util/symbol.h | 2 ++ 18 files changed, 74 insertions(+), 56 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo