aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKan Liang <kan.liang@intel.com>2015-08-04 04:30:20 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-08-05 15:42:11 -0400
commitc3a6a8c40538f609923acf9473250266283269a5 (patch)
tree45cbe3f333405aa0f2721f6b61579b80a0246750
parent320677123905fd1dd122895cd5fb870ee9e1380b (diff)
perf tools: Refine parse/config callchain functions
Pass global callchain_param into parse_callchain_record_opt and perf_evsel__config_callgraph as parameter. So we can reuse these functions to parse/config local param for callchain. Signed-off-by: Kan Liang <kan.liang@intel.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Andi Kleen <ak@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Link: http://lkml.kernel.org/r/1438677022-34296-3-git-send-email-kan.liang@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/builtin-record.c2
-rw-r--r--tools/perf/util/callchain.c14
-rw-r--r--tools/perf/util/callchain.h2
-rw-r--r--tools/perf/util/evsel.c11
4 files changed, 15 insertions, 14 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index f51131b11ad7..25cf6b404e8a 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -779,7 +779,7 @@ int record_parse_callchain_opt(const struct option *opt,
779 return 0; 779 return 0;
780 } 780 }
781 781
782 ret = parse_callchain_record_opt(arg); 782 ret = parse_callchain_record_opt(arg, &callchain_param);
783 if (!ret) 783 if (!ret)
784 callchain_debug(); 784 callchain_debug();
785 785
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 9f643ee77001..931cca8e6ae8 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -53,7 +53,7 @@ static int get_stack_size(const char *str, unsigned long *_size)
53} 53}
54#endif /* HAVE_DWARF_UNWIND_SUPPORT */ 54#endif /* HAVE_DWARF_UNWIND_SUPPORT */
55 55
56int parse_callchain_record_opt(const char *arg) 56int parse_callchain_record_opt(const char *arg, struct callchain_param *param)
57{ 57{
58 char *tok, *name, *saveptr = NULL; 58 char *tok, *name, *saveptr = NULL;
59 char *buf; 59 char *buf;
@@ -73,7 +73,7 @@ int parse_callchain_record_opt(const char *arg)
73 /* Framepointer style */ 73 /* Framepointer style */
74 if (!strncmp(name, "fp", sizeof("fp"))) { 74 if (!strncmp(name, "fp", sizeof("fp"))) {
75 if (!strtok_r(NULL, ",", &saveptr)) { 75 if (!strtok_r(NULL, ",", &saveptr)) {
76 callchain_param.record_mode = CALLCHAIN_FP; 76 param->record_mode = CALLCHAIN_FP;
77 ret = 0; 77 ret = 0;
78 } else 78 } else
79 pr_err("callchain: No more arguments " 79 pr_err("callchain: No more arguments "
@@ -86,20 +86,20 @@ int parse_callchain_record_opt(const char *arg)
86 const unsigned long default_stack_dump_size = 8192; 86 const unsigned long default_stack_dump_size = 8192;
87 87
88 ret = 0; 88 ret = 0;
89 callchain_param.record_mode = CALLCHAIN_DWARF; 89 param->record_mode = CALLCHAIN_DWARF;
90 callchain_param.dump_size = default_stack_dump_size; 90 param->dump_size = default_stack_dump_size;
91 91
92 tok = strtok_r(NULL, ",", &saveptr); 92 tok = strtok_r(NULL, ",", &saveptr);
93 if (tok) { 93 if (tok) {
94 unsigned long size = 0; 94 unsigned long size = 0;
95 95
96 ret = get_stack_size(tok, &size); 96 ret = get_stack_size(tok, &size);
97 callchain_param.dump_size = size; 97 param->dump_size = size;
98 } 98 }
99#endif /* HAVE_DWARF_UNWIND_SUPPORT */ 99#endif /* HAVE_DWARF_UNWIND_SUPPORT */
100 } else if (!strncmp(name, "lbr", sizeof("lbr"))) { 100 } else if (!strncmp(name, "lbr", sizeof("lbr"))) {
101 if (!strtok_r(NULL, ",", &saveptr)) { 101 if (!strtok_r(NULL, ",", &saveptr)) {
102 callchain_param.record_mode = CALLCHAIN_LBR; 102 param->record_mode = CALLCHAIN_LBR;
103 ret = 0; 103 ret = 0;
104 } else 104 } else
105 pr_err("callchain: No more arguments " 105 pr_err("callchain: No more arguments "
@@ -219,7 +219,7 @@ int perf_callchain_config(const char *var, const char *value)
219 var += sizeof("call-graph.") - 1; 219 var += sizeof("call-graph.") - 1;
220 220
221 if (!strcmp(var, "record-mode")) 221 if (!strcmp(var, "record-mode"))
222 return parse_callchain_record_opt(value); 222 return parse_callchain_record_opt(value, &callchain_param);
223#ifdef HAVE_DWARF_UNWIND_SUPPORT 223#ifdef HAVE_DWARF_UNWIND_SUPPORT
224 if (!strcmp(var, "dump-size")) { 224 if (!strcmp(var, "dump-size")) {
225 unsigned long size = 0; 225 unsigned long size = 0;
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 679c2c6d8ade..68a32c2fe87a 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -177,7 +177,7 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
177 bool hide_unresolved); 177 bool hide_unresolved);
178 178
179extern const char record_callchain_help[]; 179extern const char record_callchain_help[];
180int parse_callchain_record_opt(const char *arg); 180int parse_callchain_record_opt(const char *arg, struct callchain_param *param);
181int parse_callchain_report_opt(const char *arg); 181int parse_callchain_report_opt(const char *arg);
182int perf_callchain_config(const char *var, const char *value); 182int perf_callchain_config(const char *var, const char *value);
183 183
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 7febfe255703..f572f469a30d 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -545,14 +545,15 @@ int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size)
545 545
546static void 546static void
547perf_evsel__config_callgraph(struct perf_evsel *evsel, 547perf_evsel__config_callgraph(struct perf_evsel *evsel,
548 struct record_opts *opts) 548 struct record_opts *opts,
549 struct callchain_param *param)
549{ 550{
550 bool function = perf_evsel__is_function_event(evsel); 551 bool function = perf_evsel__is_function_event(evsel);
551 struct perf_event_attr *attr = &evsel->attr; 552 struct perf_event_attr *attr = &evsel->attr;
552 553
553 perf_evsel__set_sample_bit(evsel, CALLCHAIN); 554 perf_evsel__set_sample_bit(evsel, CALLCHAIN);
554 555
555 if (callchain_param.record_mode == CALLCHAIN_LBR) { 556 if (param->record_mode == CALLCHAIN_LBR) {
556 if (!opts->branch_stack) { 557 if (!opts->branch_stack) {
557 if (attr->exclude_user) { 558 if (attr->exclude_user) {
558 pr_warning("LBR callstack option is only available " 559 pr_warning("LBR callstack option is only available "
@@ -568,12 +569,12 @@ perf_evsel__config_callgraph(struct perf_evsel *evsel,
568 "Falling back to framepointers.\n"); 569 "Falling back to framepointers.\n");
569 } 570 }
570 571
571 if (callchain_param.record_mode == CALLCHAIN_DWARF) { 572 if (param->record_mode == CALLCHAIN_DWARF) {
572 if (!function) { 573 if (!function) {
573 perf_evsel__set_sample_bit(evsel, REGS_USER); 574 perf_evsel__set_sample_bit(evsel, REGS_USER);
574 perf_evsel__set_sample_bit(evsel, STACK_USER); 575 perf_evsel__set_sample_bit(evsel, STACK_USER);
575 attr->sample_regs_user = PERF_REGS_MASK; 576 attr->sample_regs_user = PERF_REGS_MASK;
576 attr->sample_stack_user = callchain_param.dump_size; 577 attr->sample_stack_user = param->dump_size;
577 attr->exclude_callchain_user = 1; 578 attr->exclude_callchain_user = 1;
578 } else { 579 } else {
579 pr_info("Cannot use DWARF unwind for function trace event," 580 pr_info("Cannot use DWARF unwind for function trace event,"
@@ -714,7 +715,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)
714 evsel->attr.exclude_callchain_user = 1; 715 evsel->attr.exclude_callchain_user = 1;
715 716
716 if (callchain_param.enabled && !evsel->no_aux_samples) 717 if (callchain_param.enabled && !evsel->no_aux_samples)
717 perf_evsel__config_callgraph(evsel, opts); 718 perf_evsel__config_callgraph(evsel, opts, &callchain_param);
718 719
719 if (opts->sample_intr_regs) { 720 if (opts->sample_intr_regs) {
720 attr->sample_regs_intr = PERF_REGS_MASK; 721 attr->sample_regs_intr = PERF_REGS_MASK;