perf callchain: Stop validating callchains by the max_stack sysctl
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: bf8bddbf1971d40549f33bc6f70623cf53bbfa2f Gitweb: http://git.kernel.org/tip/bf8bddbf1971d40549f33bc6f70623cf53bbfa2f Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 19 May 2016 11:14:15 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 20 May 2016 11:43:56 -0300
perf callchain: Stop validating callchains by the max_stack sysctl
As thread__resolve_callchain_sample can be used for handling perf.data files, that could've been recorded with a large max_stack sysctl setting than what the system used for analysis has set.
Cc Adrian Hunter <[email protected]>
Cc Alexander Shishkin <[email protected]>
Cc Alexei Starovoitov <[email protected]>
Cc Brendan Gregg <[email protected]>
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc He Kuang <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Masami Hiramatsu <[email protected]>
Cc Milian Wolff <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Cc Thomas Gleixner <[email protected]>
Cc Vince Weaver <[email protected]>
Cc Wang Nan <[email protected]>
Cc Zefan Li <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/machine.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-)
tools/perf/util/machine.c +5 -20
@@ -1771,11 +1771,6 @@ static int resolve_lbr_callchain_sample(struct thread *thread,*/ int mix_chain_nr = i +1 + lbr_nr +1 ; -if (mix_chain_nr > (int )sysctl_perf_event_max_stack +PERF_MAX_BRANCH_DEPTH ) { -pr_warning ("corrupted callchain. skipping...\n" ); -return 0 ; - } -for (j =0 ; j < mix_chain_nr; j++) {if (callchain_param.order ==ORDER_CALLEE ) {if (j < i +1 )
@@ -1815,7 +1810,7 @@ static int thread__resolve_callchain_sample(struct thread *thread,struct ip_callchain *chain = sample->callchain;int chain_nr = chain->nr;u8 cpumode =PERF_RECORD_MISC_USER ; -int i, j, err, nr_entries, nr_contexts; +int i, j, err, nr_entries;int skip_idx =-1 ;int first_call =0 ;
@@ -1830,8 +1825,7 @@ static int thread__resolve_callchain_sample(struct thread *thread,* Based on DWARF debug information, some architectures skip * a callchain entry saved by the kernel. */ -if (chain_nr < sysctl_perf_event_max_stack) - skip_idx =arch_skip_callchain_idx (thread, chain); + skip_idx =arch_skip_callchain_idx (thread, chain);/* * Add branches to call stack for easier browsing. This gives
@@ -1891,7 +1885,7 @@ static int thread__resolve_callchain_sample(struct thread *thread, } check_calls: -for (i = first_call, nr_entries =0 , nr_contexts =0 ; +for (i = first_call, nr_entries =0 ; i < chain_nr && nr_entries < max_stack; i++) {u64 ip;
@@ -1906,13 +1900,8 @@ check_calls:#endif ip = chain->ips[j]; -if (ip >=PERF_CONTEXT_MAX ) { -if (++nr_contexts > sysctl_perf_event_max_contexts_per_stack) - goto out_corrupted_callchain; - }else { -if (++nr_entries > sysctl_perf_event_max_stack) - goto out_corrupted_callchain; - } +if (ip <PERF_CONTEXT_MAX ) + ++nr_entries; err =add_callchain_ip (thread, cursor, parent, root_al, &cpumode, ip);
@@ -1921,10 +1910,6 @@ check_calls: }return 0 ; - -out_corrupted_callchain: -pr_warning ("corrupted callchain. skipping...\n" ); -return 0 ; }static int unwind_entry (struct unwind_entry *entry,void *arg)