From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Andi Kleen <andi@firstfloor.org>
Cc: jolsa@redhat.com, linux-kernel@vger.kernel.org,
namhyung@kernel.org, Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH 02/10] perf, tools: Support handling complete branch stacks as histograms
Date: Thu, 13 Nov 2014 16:14:17 -0300 [thread overview]
Message-ID: <20141113191417.GC3612@kernel.org> (raw)
In-Reply-To: <1415844328-4884-3-git-send-email-andi@firstfloor.org>
Em Wed, Nov 12, 2014 at 06:05:20PM -0800, Andi Kleen escreveu:
> +static int remove_loops(struct branch_entry *l, int nr)
> +{
> + int i, j, off;
> + unsigned char chash[CHASHSZ];
> +
> + memset(chash, NO_ENTRY, sizeof(chash));
> +
> + BUG_ON(nr >= 256);
What is wrong with return -1 and propagating the error, so that the user
is informed if the data being processed is bogus, stop processing with a
warning or continue processing if finding the next valid record is
possible?
In general just aborting (and this only does that when NDEBUG is set)
should be avoided...
I can go on and help you and do that for you, but why introduce it in
the first place?
- Arnaldo
> + for (i = 0; i < nr; i++) {
> + int h = hash_64(l[i].from, CHASHBITS) % CHASHSZ;
> +
> + /* no collision handling for now */
> + if (chash[h] == NO_ENTRY) {
> + chash[h] = i;
> + } else if (l[chash[h]].from == l[i].from) {
> + bool is_loop = true;
> + /* check if it is a real loop */
> + off = 0;
> + for (j = chash[h]; j < i && i + off < nr; j++, off++)
> + if (l[j].from != l[i + off].from) {
> + is_loop = false;
> + break;
> + }
> + if (is_loop) {
> + memmove(l + i, l + i + off,
> + (nr - (i + off)) * sizeof(*l));
> + nr -= off;
> + }
> + }
> + }
> + return nr;
> +}
> +
> static int thread__resolve_callchain_sample(struct thread *thread,
> struct ip_callchain *chain,
> + struct branch_stack *branch,
> struct symbol **parent,
> struct addr_location *root_al,
> int max_stack)
> @@ -1438,22 +1484,82 @@ static int thread__resolve_callchain_sample(struct thread *thread,
> int i;
> int j;
> int err;
> - int skip_idx __maybe_unused;
> + int skip_idx = -1;
> + int first_call = 0;
> +
> + /*
> + * Based on DWARF debug information, some architectures skip
> + * a callchain entry saved by the kernel.
> + */
> + if (chain->nr < PERF_MAX_STACK_DEPTH)
> + skip_idx = arch_skip_callchain_idx(thread, chain);
>
> callchain_cursor_reset(&callchain_cursor);
>
> + /*
> + * Add branches to call stack for easier browsing. This gives
> + * more context for a sample than just the callers.
> + *
> + * This uses individual histograms of paths compared to the
> + * aggregated histograms the normal LBR mode uses.
> + *
> + * Limitations for now:
> + * - No extra filters
> + * - No annotations (should annotate somehow)
> + */
> +
> + if (branch && callchain_param.branch_callstack) {
> + int nr = min(max_stack, (int)branch->nr);
> + struct branch_entry be[nr];
> +
> + if (branch->nr > PERF_MAX_BRANCH_DEPTH) {
> + pr_warning("corrupted branch chain. skipping...\n");
> + goto check_calls;
> + }
> +
> + for (i = 0; i < nr; i++) {
> + if (callchain_param.order == ORDER_CALLEE) {
> + be[i] = branch->entries[i];
> + /*
> + * Check for overlap into the callchain.
> + * The return address is one off compared to
> + * the branch entry. To adjust for this
> + * assume the calling instruction is not longer
> + * than 8 bytes.
> + */
> + if (i == skip_idx ||
> + chain->ips[first_call] >= PERF_CONTEXT_MAX)
> + first_call++;
> + else if (be[i].from < chain->ips[first_call] &&
> + be[i].from >= chain->ips[first_call] - 8)
> + first_call++;
> + } else
> + be[i] = branch->entries[branch->nr - i - 1];
> + }
> +
> + nr = remove_loops(be, nr);
> +
> + for (i = 0; i < nr; i++) {
> + err = add_callchain_ip(thread, parent, root_al,
> + -1, be[i].to);
> + if (!err)
> + err = add_callchain_ip(thread, parent, root_al,
> + -1, be[i].from);
> + if (err == -EINVAL)
> + break;
> + if (err)
> + return err;
> + }
> + chain_nr -= nr;
> + }
> +
> +check_calls:
> if (chain->nr > PERF_MAX_STACK_DEPTH) {
> pr_warning("corrupted callchain. skipping...\n");
> return 0;
> }
>
> - /*
> - * Based on DWARF debug information, some architectures skip
> - * a callchain entry saved by the kernel.
> - */
> - skip_idx = arch_skip_callchain_idx(thread, chain);
> -
> - for (i = 0; i < chain_nr; i++) {
> + for (i = first_call; i < chain_nr; i++) {
> u64 ip;
>
> if (callchain_param.order == ORDER_CALLEE)
> @@ -1517,6 +1623,7 @@ int thread__resolve_callchain(struct thread *thread,
> int max_stack)
> {
> int ret = thread__resolve_callchain_sample(thread, sample->callchain,
> + sample->branch_stack,
> parent, root_al, max_stack);
> if (ret)
> return ret;
> diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
> index ded3ca7..b364d96 100644
> --- a/tools/perf/util/symbol.h
> +++ b/tools/perf/util/symbol.h
> @@ -123,7 +123,8 @@ struct symbol_conf {
> demangle,
> demangle_kernel,
> filter_relative,
> - show_hist_headers;
> + show_hist_headers,
> + branch_callstack;
> const char *vmlinux_name,
> *kallsyms_name,
> *source_prefix,
> --
> 1.9.3
next prev parent reply other threads:[~2014-11-13 19:14 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-13 2:05 Implement lbr-as-callgraph v10 Andi Kleen
2014-11-13 2:05 ` [PATCH 01/10] perf, tools: Factor out adding new call chain entries Andi Kleen
2014-11-13 19:14 ` Arnaldo Carvalho de Melo
2014-11-20 7:37 ` [tip:perf/core] perf callchain: " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 02/10] perf, tools: Support handling complete branch stacks as histograms Andi Kleen
2014-11-13 19:14 ` Arnaldo Carvalho de Melo [this message]
2014-11-13 19:52 ` Andi Kleen
2014-11-13 20:08 ` Arnaldo Carvalho de Melo
2014-11-13 20:15 ` Andi Kleen
2014-11-13 20:42 ` Arnaldo Carvalho de Melo
2014-12-08 6:53 ` [tip:perf/core] perf callchain: " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 03/10] perf, tools: Use al.addr to set up call chain Andi Kleen
2014-11-13 19:16 ` Arnaldo Carvalho de Melo
2014-12-11 21:46 ` Jiri Olsa
2014-12-11 22:27 ` Andi Kleen
2014-11-20 7:38 ` [tip:perf/core] perf callchain: " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 04/10] perf, tools: Add --branch-history option to report Andi Kleen
2014-12-08 6:53 ` [tip:perf/core] perf report: Add --branch-history option tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 05/10] perf, tools: Use a common function to resolve symbol or name Andi Kleen
2014-11-13 19:17 ` Arnaldo Carvalho de Melo
2014-11-20 7:38 ` [tip:perf/core] perf callchain: " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 06/10] perf, tools: Enable printing the srcline in the history Andi Kleen
2014-11-13 19:20 ` Arnaldo Carvalho de Melo
2014-12-08 6:48 ` [tip:perf/core] perf callchain: " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 07/10] perf, tools: Only print base source file for srcline Andi Kleen
2014-11-13 19:22 ` Arnaldo Carvalho de Melo
2014-11-20 7:38 ` [tip:perf/core] perf " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 08/10] perf, tools: Support source line numbers in annotate Andi Kleen
2014-11-13 20:52 ` Arnaldo Carvalho de Melo
2014-11-20 7:39 ` [tip:perf/core] perf annotate: " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 09/10] tools, perf: Make get_srcline fall back to sym+offset Andi Kleen
2014-12-08 6:49 ` [tip:perf/core] perf callchain: " tip-bot for Andi Kleen
2014-11-13 2:05 ` [PATCH 10/10] tools, perf: Add asprintf replacement Andi Kleen
2014-11-13 20:53 ` Arnaldo Carvalho de Melo
2014-11-13 21:14 ` Andi Kleen
2014-11-17 21:34 ` Implement lbr-as-callgraph v10 Arnaldo Carvalho de Melo
2014-11-18 1:56 ` Andi Kleen
2014-11-18 10:44 ` Jiri Olsa
2014-11-18 11:00 ` Jiri Olsa
2014-11-18 13:37 ` Arnaldo Carvalho de Melo
2014-11-19 15:31 ` Andi Kleen
2014-11-19 6:21 ` Namhyung Kim
2014-11-19 9:23 ` Jiri Olsa
2014-11-19 10:54 ` Jiri Olsa
2014-11-19 14:10 ` Arnaldo Carvalho de Melo
2014-11-19 16:04 ` Arnaldo Carvalho de Melo
2014-11-19 21:48 ` Andi Kleen
2014-11-20 19:33 ` Arnaldo Carvalho de Melo
2014-11-20 20:46 ` Andi Kleen
2014-11-21 20:30 ` Arnaldo Carvalho de Melo
2014-11-22 1:25 ` Andi Kleen
2014-11-24 7:40 ` Namhyung Kim
2014-11-19 21:50 ` Andi Kleen
2014-11-20 20:36 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141113191417.GC3612@kernel.org \
--to=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=andi@firstfloor.org \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=namhyung@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.