mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 21:51:40 +00:00
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>
This commit is contained in:
parent
3206771239
commit
c3a6a8c405
@ -779,7 +779,7 @@ int record_parse_callchain_opt(const struct option *opt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = parse_callchain_record_opt(arg);
|
||||
ret = parse_callchain_record_opt(arg, &callchain_param);
|
||||
if (!ret)
|
||||
callchain_debug();
|
||||
|
||||
|
@ -53,7 +53,7 @@ static int get_stack_size(const char *str, unsigned long *_size)
|
||||
}
|
||||
#endif /* HAVE_DWARF_UNWIND_SUPPORT */
|
||||
|
||||
int parse_callchain_record_opt(const char *arg)
|
||||
int parse_callchain_record_opt(const char *arg, struct callchain_param *param)
|
||||
{
|
||||
char *tok, *name, *saveptr = NULL;
|
||||
char *buf;
|
||||
@ -73,7 +73,7 @@ int parse_callchain_record_opt(const char *arg)
|
||||
/* Framepointer style */
|
||||
if (!strncmp(name, "fp", sizeof("fp"))) {
|
||||
if (!strtok_r(NULL, ",", &saveptr)) {
|
||||
callchain_param.record_mode = CALLCHAIN_FP;
|
||||
param->record_mode = CALLCHAIN_FP;
|
||||
ret = 0;
|
||||
} else
|
||||
pr_err("callchain: No more arguments "
|
||||
@ -86,20 +86,20 @@ int parse_callchain_record_opt(const char *arg)
|
||||
const unsigned long default_stack_dump_size = 8192;
|
||||
|
||||
ret = 0;
|
||||
callchain_param.record_mode = CALLCHAIN_DWARF;
|
||||
callchain_param.dump_size = default_stack_dump_size;
|
||||
param->record_mode = CALLCHAIN_DWARF;
|
||||
param->dump_size = default_stack_dump_size;
|
||||
|
||||
tok = strtok_r(NULL, ",", &saveptr);
|
||||
if (tok) {
|
||||
unsigned long size = 0;
|
||||
|
||||
ret = get_stack_size(tok, &size);
|
||||
callchain_param.dump_size = size;
|
||||
param->dump_size = size;
|
||||
}
|
||||
#endif /* HAVE_DWARF_UNWIND_SUPPORT */
|
||||
} else if (!strncmp(name, "lbr", sizeof("lbr"))) {
|
||||
if (!strtok_r(NULL, ",", &saveptr)) {
|
||||
callchain_param.record_mode = CALLCHAIN_LBR;
|
||||
param->record_mode = CALLCHAIN_LBR;
|
||||
ret = 0;
|
||||
} else
|
||||
pr_err("callchain: No more arguments "
|
||||
@ -219,7 +219,7 @@ int perf_callchain_config(const char *var, const char *value)
|
||||
var += sizeof("call-graph.") - 1;
|
||||
|
||||
if (!strcmp(var, "record-mode"))
|
||||
return parse_callchain_record_opt(value);
|
||||
return parse_callchain_record_opt(value, &callchain_param);
|
||||
#ifdef HAVE_DWARF_UNWIND_SUPPORT
|
||||
if (!strcmp(var, "dump-size")) {
|
||||
unsigned long size = 0;
|
||||
|
@ -177,7 +177,7 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
|
||||
bool hide_unresolved);
|
||||
|
||||
extern const char record_callchain_help[];
|
||||
int parse_callchain_record_opt(const char *arg);
|
||||
int parse_callchain_record_opt(const char *arg, struct callchain_param *param);
|
||||
int parse_callchain_report_opt(const char *arg);
|
||||
int perf_callchain_config(const char *var, const char *value);
|
||||
|
||||
|
@ -545,14 +545,15 @@ int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size)
|
||||
|
||||
static void
|
||||
perf_evsel__config_callgraph(struct perf_evsel *evsel,
|
||||
struct record_opts *opts)
|
||||
struct record_opts *opts,
|
||||
struct callchain_param *param)
|
||||
{
|
||||
bool function = perf_evsel__is_function_event(evsel);
|
||||
struct perf_event_attr *attr = &evsel->attr;
|
||||
|
||||
perf_evsel__set_sample_bit(evsel, CALLCHAIN);
|
||||
|
||||
if (callchain_param.record_mode == CALLCHAIN_LBR) {
|
||||
if (param->record_mode == CALLCHAIN_LBR) {
|
||||
if (!opts->branch_stack) {
|
||||
if (attr->exclude_user) {
|
||||
pr_warning("LBR callstack option is only available "
|
||||
@ -568,12 +569,12 @@ perf_evsel__config_callgraph(struct perf_evsel *evsel,
|
||||
"Falling back to framepointers.\n");
|
||||
}
|
||||
|
||||
if (callchain_param.record_mode == CALLCHAIN_DWARF) {
|
||||
if (param->record_mode == CALLCHAIN_DWARF) {
|
||||
if (!function) {
|
||||
perf_evsel__set_sample_bit(evsel, REGS_USER);
|
||||
perf_evsel__set_sample_bit(evsel, STACK_USER);
|
||||
attr->sample_regs_user = PERF_REGS_MASK;
|
||||
attr->sample_stack_user = callchain_param.dump_size;
|
||||
attr->sample_stack_user = param->dump_size;
|
||||
attr->exclude_callchain_user = 1;
|
||||
} else {
|
||||
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)
|
||||
evsel->attr.exclude_callchain_user = 1;
|
||||
|
||||
if (callchain_param.enabled && !evsel->no_aux_samples)
|
||||
perf_evsel__config_callgraph(evsel, opts);
|
||||
perf_evsel__config_callgraph(evsel, opts, &callchain_param);
|
||||
|
||||
if (opts->sample_intr_regs) {
|
||||
attr->sample_regs_intr = PERF_REGS_MASK;
|
||||
|
Loading…
Reference in New Issue
Block a user