perf tools: Factor out sample__resolve_callchain()

The report__resolve_callchain() can be shared with perf top code as it
doesn't really depend on the perf report code.  Factor it out as
sample__resolve_callchain().  The same goes to the hist_entry__append_
callchain() too.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Arun Sharma <asharma@fb.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Rodrigo Campos <rodrigo@sdfg.com.ar>
Link: http://lkml.kernel.org/r/1389677157-30513-3-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Namhyung Kim 2014-01-14 14:25:35 +09:00 committed by Arnaldo Carvalho de Melo
parent 540476de74
commit 2dc9fb1a7b
4 changed files with 39 additions and 36 deletions

View File

@ -75,24 +75,6 @@ static int report__config(const char *var, const char *value, void *cb)
return perf_default_config(var, value, cb); return perf_default_config(var, value, cb);
} }
static int report__resolve_callchain(struct report *rep, struct symbol **parent,
struct perf_evsel *evsel, struct addr_location *al,
struct perf_sample *sample)
{
if ((sort__has_parent || symbol_conf.use_callchain) && sample->callchain) {
return machine__resolve_callchain(al->machine, evsel, al->thread, sample,
parent, al, rep->max_stack);
}
return 0;
}
static int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample)
{
if (!symbol_conf.use_callchain)
return 0;
return callchain_append(he->callchain, &callchain_cursor, sample->period);
}
static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_location *al, static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_location *al,
struct perf_sample *sample, struct perf_evsel *evsel, struct perf_sample *sample, struct perf_evsel *evsel,
union perf_event *event) union perf_event *event)
@ -103,7 +85,7 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati
struct hist_entry *he; struct hist_entry *he;
struct mem_info *mi, *mx; struct mem_info *mi, *mx;
uint64_t cost; uint64_t cost;
int err = report__resolve_callchain(rep, &parent, evsel, al, sample); int err = sample__resolve_callchain(sample, &parent, evsel, al, rep->max_stack);
if (err) if (err)
return err; return err;
@ -155,7 +137,7 @@ static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_loc
unsigned i; unsigned i;
struct hist_entry *he; struct hist_entry *he;
struct branch_info *bi, *bx; struct branch_info *bi, *bx;
int err = report__resolve_callchain(rep, &parent, evsel, al, sample); int err = sample__resolve_callchain(sample, &parent, evsel, al, rep->max_stack);
if (err) if (err)
return err; return err;
@ -208,7 +190,7 @@ static int report__add_hist_entry(struct perf_tool *tool, struct perf_evsel *evs
struct report *rep = container_of(tool, struct report, tool); struct report *rep = container_of(tool, struct report, tool);
struct symbol *parent = NULL; struct symbol *parent = NULL;
struct hist_entry *he; struct hist_entry *he;
int err = report__resolve_callchain(rep, &parent, evsel, al, sample); int err = sample__resolve_callchain(sample, &parent, evsel, al, rep->max_stack);
if (err) if (err)
return err; return err;

View File

@ -743,15 +743,10 @@ static void perf_event__process_sample(struct perf_tool *tool,
if (al.sym == NULL || !al.sym->ignore) { if (al.sym == NULL || !al.sym->ignore) {
struct hist_entry *he; struct hist_entry *he;
if ((sort__has_parent || symbol_conf.use_callchain) && err = sample__resolve_callchain(sample, &parent, evsel, &al,
sample->callchain) { top->max_stack);
err = machine__resolve_callchain(machine, evsel, if (err)
al.thread, sample, return;
&parent, &al,
top->max_stack);
if (err)
return;
}
he = perf_evsel__add_hist_entry(evsel, &al, sample); he = perf_evsel__add_hist_entry(evsel, &al, sample);
if (he == NULL) { if (he == NULL) {
@ -759,12 +754,9 @@ static void perf_event__process_sample(struct perf_tool *tool,
return; return;
} }
if (symbol_conf.use_callchain) { err = hist_entry__append_callchain(he, sample);
err = callchain_append(he->callchain, &callchain_cursor, if (err)
sample->period); return;
if (err)
return;
}
if (sort__has_sym) if (sort__has_sym)
perf_top__record_precise_ip(top, he, evsel->idx, ip); perf_top__record_precise_ip(top, he, evsel->idx, ip);

View File

@ -17,6 +17,8 @@
#include "hist.h" #include "hist.h"
#include "util.h" #include "util.h"
#include "sort.h"
#include "machine.h"
#include "callchain.h" #include "callchain.h"
__thread struct callchain_cursor callchain_cursor; __thread struct callchain_cursor callchain_cursor;
@ -531,3 +533,24 @@ int callchain_cursor_append(struct callchain_cursor *cursor,
return 0; return 0;
} }
int sample__resolve_callchain(struct perf_sample *sample, struct symbol **parent,
struct perf_evsel *evsel, struct addr_location *al,
int max_stack)
{
if (sample->callchain == NULL)
return 0;
if (symbol_conf.use_callchain || sort__has_parent) {
return machine__resolve_callchain(al->machine, evsel, al->thread,
sample, parent, al, max_stack);
}
return 0;
}
int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample)
{
if (!symbol_conf.use_callchain)
return 0;
return callchain_append(he->callchain, &callchain_cursor, sample->period);
}

View File

@ -145,10 +145,16 @@ static inline void callchain_cursor_advance(struct callchain_cursor *cursor)
} }
struct option; struct option;
struct hist_entry;
int record_parse_callchain(const char *arg, struct record_opts *opts); int record_parse_callchain(const char *arg, struct record_opts *opts);
int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset); int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset);
int record_callchain_opt(const struct option *opt, const char *arg, int unset); int record_callchain_opt(const struct option *opt, const char *arg, int unset);
int sample__resolve_callchain(struct perf_sample *sample, struct symbol **parent,
struct perf_evsel *evsel, struct addr_location *al,
int max_stack);
int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sample);
extern const char record_callchain_help[]; extern const char record_callchain_help[];
#endif /* __PERF_CALLCHAIN_H */ #endif /* __PERF_CALLCHAIN_H */