From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965375AbcIVPja (ORCPT ); Thu, 22 Sep 2016 11:39:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43424 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935058AbcIVPjQ (ORCPT ); Thu, 22 Sep 2016 11:39:16 -0400 From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: lkml , Don Zickus , Joe Mario , Ingo Molnar , Peter Zijlstra , Namhyung Kim , David Ahern , Andi Kleen Subject: [PATCH 48/57] perf c2c report: Allow to report callchains Date: Thu, 22 Sep 2016 17:37:16 +0200 Message-Id: <1474558645-19956-49-git-send-email-jolsa@kernel.org> In-Reply-To: <1474558645-19956-1-git-send-email-jolsa@kernel.org> References: <1474558645-19956-1-git-send-email-jolsa@kernel.org> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 22 Sep 2016 15:39:16 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add --call-graph option to properly setup callchain code. Adding default settings to display callchains whenever they are stored in the perf.data. Link: http://lkml.kernel.org/n/tip-inykbom2f19difvsu1e18avr@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/builtin-c2c.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index 71b6850809a2..31e311959480 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -17,6 +17,7 @@ #include "evsel.h" #include #include "ui/browsers/hists.h" +#include "evlist.h" struct c2c_hists { struct hists hists; @@ -181,6 +182,11 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, return -1; } + ret = sample__resolve_callchain(sample, &callchain_cursor, NULL, + evsel, &al, sysctl_perf_event_max_stack); + if (ret) + goto out; + mi = sample__resolve_mem(sample, &al); if (mi == NULL) return -ENOMEM; @@ -2114,6 +2120,58 @@ static void ui_quirks(void) } } +#define CALLCHAIN_DEFAULT_OPT "graph,0.5,caller,function,percent" + +const char callchain_help[] = "Display call graph (stack chain/backtrace):\n\n" + CALLCHAIN_REPORT_HELP + "\n\t\t\t\tDefault: " CALLCHAIN_DEFAULT_OPT; + +static int +parse_callchain_opt(const struct option *opt, const char *arg, int unset) +{ + struct callchain_param *callchain = opt->value; + + callchain->enabled = !unset; + /* + * --no-call-graph + */ + if (unset) { + symbol_conf.use_callchain = false; + callchain->mode = CHAIN_NONE; + return 0; + } + + return parse_callchain_report_opt(arg); +} + +static int setup_callchain(struct perf_evlist *evlist) +{ + u64 sample_type = perf_evlist__combined_sample_type(evlist); + enum perf_call_graph_mode mode = CALLCHAIN_NONE; + + if ((sample_type & PERF_SAMPLE_REGS_USER) && + (sample_type & PERF_SAMPLE_STACK_USER)) + mode = CALLCHAIN_DWARF; + else if (sample_type & PERF_SAMPLE_BRANCH_STACK) + mode = CALLCHAIN_LBR; + else if (sample_type & PERF_SAMPLE_CALLCHAIN) + mode = CALLCHAIN_FP; + + if (!callchain_param.enabled && + callchain_param.mode != CHAIN_NONE && + mode != CALLCHAIN_NONE) { + symbol_conf.use_callchain = true; + if (callchain_register_param(&callchain_param) < 0) { + ui__error("Can't register callchain params.\n"); + return -EINVAL; + } + } + + callchain_param.record_mode = mode; + callchain_param.min_percent = 0; + return 0; +} + static int perf_c2c__report(int argc, const char **argv) { struct perf_session *session; @@ -2121,6 +2179,7 @@ static int perf_c2c__report(int argc, const char **argv) struct perf_data_file file = { .mode = PERF_DATA_MODE_READ, }; + char callchain_default_opt[] = CALLCHAIN_DEFAULT_OPT; const struct option c2c_options[] = { OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name, "file", "vmlinux pathname"), @@ -2135,6 +2194,10 @@ static int perf_c2c__report(int argc, const char **argv) #endif OPT_BOOLEAN(0, "stats", &c2c.stats_only, "Use the stdio interface"), + OPT_CALLBACK_DEFAULT('g', "call-graph", &callchain_param, + "print_type,threshold[,print_limit],order,sort_key[,branch],value", + callchain_help, &parse_callchain_opt, + callchain_default_opt), OPT_END() }; int err = 0; @@ -2176,6 +2239,10 @@ static int perf_c2c__report(int argc, const char **argv) goto out; } + err = setup_callchain(session->evlist); + if (err) + goto out_session; + if (symbol__init(&session->header.env) < 0) goto out_session; -- 2.7.4