[PATCH 48/57] perf c2c report: Allow to report callchains

2016-09-22 Thread Jiri Olsa
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-inykbom2f19difvsu1e18...@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 histshists;
@@ -181,6 +182,11 @@ static int process_sample_event(struct perf_tool *tool 
__maybe_unused,
return -1;
}
 
+   ret = sample__resolve_callchain(sample, _cursor, NULL,
+   evsel, , 
sysctl_perf_event_max_stack);
+   if (ret)
+   goto out;
+
mi = sample__resolve_mem(sample, );
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(_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", _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", _only,
"Use the stdio interface"),
+   OPT_CALLBACK_DEFAULT('g', "call-graph", _param,
+
"print_type,threshold[,print_limit],order,sort_key[,branch],value",
+callchain_help, _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(>header.env) < 0)
goto out_session;
 
-- 
2.7.4



[PATCH 48/57] perf c2c report: Allow to report callchains

2016-09-22 Thread Jiri Olsa
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-inykbom2f19difvsu1e18...@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 histshists;
@@ -181,6 +182,11 @@ static int process_sample_event(struct perf_tool *tool 
__maybe_unused,
return -1;
}
 
+   ret = sample__resolve_callchain(sample, _cursor, NULL,
+   evsel, , 
sysctl_perf_event_max_stack);
+   if (ret)
+   goto out;
+
mi = sample__resolve_mem(sample, );
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(_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", _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", _only,
"Use the stdio interface"),
+   OPT_CALLBACK_DEFAULT('g', "call-graph", _param,
+
"print_type,threshold[,print_limit],order,sort_key[,branch],value",
+callchain_help, _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(>header.env) < 0)
goto out_session;
 
-- 
2.7.4