diff options
| author | Kan Liang <kan.liang@intel.com> | 2015-08-04 04:30:20 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-08-05 15:42:11 -0400 |
| commit | c3a6a8c40538f609923acf9473250266283269a5 (patch) | |
| tree | 45cbe3f333405aa0f2721f6b61579b80a0246750 | |
| parent | 320677123905fd1dd122895cd5fb870ee9e1380b (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.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/callchain.c | 14 | ||||
| -rw-r--r-- | tools/perf/util/callchain.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 11 |
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 | ||
| 56 | int parse_callchain_record_opt(const char *arg) | 56 | int 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 | ||
| 179 | extern const char record_callchain_help[]; | 179 | extern const char record_callchain_help[]; |
| 180 | int parse_callchain_record_opt(const char *arg); | 180 | int parse_callchain_record_opt(const char *arg, struct callchain_param *param); |
| 181 | int parse_callchain_report_opt(const char *arg); | 181 | int parse_callchain_report_opt(const char *arg); |
| 182 | int perf_callchain_config(const char *var, const char *value); | 182 | int 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 | ||
| 546 | static void | 546 | static void |
| 547 | perf_evsel__config_callgraph(struct perf_evsel *evsel, | 547 | perf_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; |
