diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-04-15 15:37:17 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-04-15 15:37:17 -0400 |
commit | 0883e820a0ac18e04f036dbebc3580351d7fd6cf (patch) | |
tree | c03348f9b88046bfcdd7d0a656e6fe06df3c51c2 | |
parent | 5cf9c84e21067ec7a44648aedbc38c197d707258 (diff) |
perf record: Export record_opts based callchain parsing helper
To be able to call it outside option parsing, like when setting a
default --call-graph parameter in 'perf trace' when just --min-stack is
used.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-xay69plylwibpb3l4isrpl1k@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/builtin-record.c | 35 | ||||
-rw-r--r-- | tools/perf/util/callchain.h | 6 |
2 files changed, 26 insertions, 15 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 3239a6ec9d23..5b4758a08a49 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -930,45 +930,50 @@ out_delete_session: | |||
930 | return status; | 930 | return status; |
931 | } | 931 | } |
932 | 932 | ||
933 | static void callchain_debug(void) | 933 | static void callchain_debug(struct callchain_param *callchain) |
934 | { | 934 | { |
935 | static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" }; | 935 | static const char *str[CALLCHAIN_MAX] = { "NONE", "FP", "DWARF", "LBR" }; |
936 | 936 | ||
937 | pr_debug("callchain: type %s\n", str[callchain_param.record_mode]); | 937 | pr_debug("callchain: type %s\n", str[callchain->record_mode]); |
938 | 938 | ||
939 | if (callchain_param.record_mode == CALLCHAIN_DWARF) | 939 | if (callchain->record_mode == CALLCHAIN_DWARF) |
940 | pr_debug("callchain: stack dump size %d\n", | 940 | pr_debug("callchain: stack dump size %d\n", |
941 | callchain_param.dump_size); | 941 | callchain->dump_size); |
942 | } | 942 | } |
943 | 943 | ||
944 | int record_parse_callchain_opt(const struct option *opt, | 944 | int record_opts__parse_callchain(struct record_opts *record, |
945 | const char *arg, | 945 | struct callchain_param *callchain, |
946 | int unset) | 946 | const char *arg, bool unset) |
947 | { | 947 | { |
948 | int ret; | 948 | int ret; |
949 | struct record_opts *record = (struct record_opts *)opt->value; | ||
950 | |||
951 | record->callgraph_set = true; | 949 | record->callgraph_set = true; |
952 | callchain_param.enabled = !unset; | 950 | callchain->enabled = !unset; |
953 | 951 | ||
954 | /* --no-call-graph */ | 952 | /* --no-call-graph */ |
955 | if (unset) { | 953 | if (unset) { |
956 | callchain_param.record_mode = CALLCHAIN_NONE; | 954 | callchain->record_mode = CALLCHAIN_NONE; |
957 | pr_debug("callchain: disabled\n"); | 955 | pr_debug("callchain: disabled\n"); |
958 | return 0; | 956 | return 0; |
959 | } | 957 | } |
960 | 958 | ||
961 | ret = parse_callchain_record_opt(arg, &callchain_param); | 959 | ret = parse_callchain_record_opt(arg, callchain); |
962 | if (!ret) { | 960 | if (!ret) { |
963 | /* Enable data address sampling for DWARF unwind. */ | 961 | /* Enable data address sampling for DWARF unwind. */ |
964 | if (callchain_param.record_mode == CALLCHAIN_DWARF) | 962 | if (callchain->record_mode == CALLCHAIN_DWARF) |
965 | record->sample_address = true; | 963 | record->sample_address = true; |
966 | callchain_debug(); | 964 | callchain_debug(callchain); |
967 | } | 965 | } |
968 | 966 | ||
969 | return ret; | 967 | return ret; |
970 | } | 968 | } |
971 | 969 | ||
970 | int record_parse_callchain_opt(const struct option *opt, | ||
971 | const char *arg, | ||
972 | int unset) | ||
973 | { | ||
974 | return record_opts__parse_callchain(opt->value, &callchain_param, arg, unset); | ||
975 | } | ||
976 | |||
972 | int record_callchain_opt(const struct option *opt, | 977 | int record_callchain_opt(const struct option *opt, |
973 | const char *arg __maybe_unused, | 978 | const char *arg __maybe_unused, |
974 | int unset __maybe_unused) | 979 | int unset __maybe_unused) |
@@ -981,7 +986,7 @@ int record_callchain_opt(const struct option *opt, | |||
981 | if (callchain_param.record_mode == CALLCHAIN_NONE) | 986 | if (callchain_param.record_mode == CALLCHAIN_NONE) |
982 | callchain_param.record_mode = CALLCHAIN_FP; | 987 | callchain_param.record_mode = CALLCHAIN_FP; |
983 | 988 | ||
984 | callchain_debug(); | 989 | callchain_debug(&callchain_param); |
985 | return 0; | 990 | return 0; |
986 | } | 991 | } |
987 | 992 | ||
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h index cae5a7b1f5c8..65e2a4f7cb4e 100644 --- a/tools/perf/util/callchain.h +++ b/tools/perf/util/callchain.h | |||
@@ -212,6 +212,12 @@ struct hist_entry; | |||
212 | int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset); | 212 | int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset); |
213 | int record_callchain_opt(const struct option *opt, const char *arg, int unset); | 213 | int record_callchain_opt(const struct option *opt, const char *arg, int unset); |
214 | 214 | ||
215 | struct record_opts; | ||
216 | |||
217 | int record_opts__parse_callchain(struct record_opts *record, | ||
218 | struct callchain_param *callchain, | ||
219 | const char *arg, bool unset); | ||
220 | |||
215 | int sample__resolve_callchain(struct perf_sample *sample, | 221 | int sample__resolve_callchain(struct perf_sample *sample, |
216 | struct callchain_cursor *cursor, struct symbol **parent, | 222 | struct callchain_cursor *cursor, struct symbol **parent, |
217 | struct perf_evsel *evsel, struct addr_location *al, | 223 | struct perf_evsel *evsel, struct addr_location *al, |