From: Arnaldo Carvalho de Melo <[email protected]>

Continuing to try to remove the code duplication introduced with mem and
branch hist entry code, this time providing prologue and epilogues to
deal with callchains when processing samples.

Acked-by: Namhyung Kim <[email protected]>
Cc: Adrian Hunter <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Link: http://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
 tools/perf/builtin-report.c | 72 ++++++++++++++++++++-------------------------
 1 file changed, 32 insertions(+), 40 deletions(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 9a20c9efb84b..8424053b399a 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -75,6 +75,24 @@ static int perf_report_config(const char *var, const char 
*value, void *cb)
        return perf_default_config(var, value, cb);
 }
 
+static int report__resolve_callchain(struct perf_report *rep, struct symbol 
**parent,
+                                    struct perf_evsel *evsel, struct 
addr_location *al,
+                                    struct perf_sample *sample, struct machine 
*machine)
+{
+       if ((sort__has_parent || symbol_conf.use_callchain) && 
sample->callchain) {
+               return machine__resolve_callchain(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 perf_report__add_mem_hist_entry(struct perf_tool *tool,
                                           struct addr_location *al,
                                           struct perf_sample *sample,
@@ -85,19 +103,13 @@ static int perf_report__add_mem_hist_entry(struct 
perf_tool *tool,
        struct perf_report *rep = container_of(tool, struct perf_report, tool);
        struct symbol *parent = NULL;
        u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-       int err = 0;
        struct hist_entry *he;
        struct mem_info *mi, *mx;
        uint64_t cost;
+       int err = report__resolve_callchain(rep, &parent, evsel, al, sample, 
machine);
 
-       if ((sort__has_parent || symbol_conf.use_callchain) &&
-           sample->callchain) {
-               err = machine__resolve_callchain(machine, evsel, al->thread,
-                                                sample, &parent, al,
-                                                rep->max_stack);
-               if (err)
-                       return err;
-       }
+       if (err)
+               return err;
 
        mi = machine__resolve_mem(machine, al->thread, sample, cpumode);
        if (!mi)
@@ -133,13 +145,7 @@ static int perf_report__add_mem_hist_entry(struct 
perf_tool *tool,
 
        evsel->hists.stats.total_period += cost;
        hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
-       err = 0;
-
-       if (symbol_conf.use_callchain) {
-               err = callchain_append(he->callchain,
-                                      &callchain_cursor,
-                                      sample->period);
-       }
+       err = hist_entry__append_callchain(he, sample);
 out:
        return err;
 }
@@ -152,19 +158,13 @@ static int perf_report__add_branch_hist_entry(struct 
perf_tool *tool,
 {
        struct perf_report *rep = container_of(tool, struct perf_report, tool);
        struct symbol *parent = NULL;
-       int err = 0;
        unsigned i;
        struct hist_entry *he;
        struct branch_info *bi, *bx;
+       int err = report__resolve_callchain(rep, &parent, evsel, al, sample, 
machine);
 
-       if ((sort__has_parent || symbol_conf.use_callchain)
-           && sample->callchain) {
-               err = machine__resolve_callchain(machine, evsel, al->thread,
-                                                sample, &parent, al,
-                                                rep->max_stack);
-               if (err)
-                       return err;
-       }
+       if (err)
+               return err;
 
        bi = machine__resolve_bstack(machine, al->thread,
                                     sample->branch_stack);
@@ -216,16 +216,11 @@ static int perf_evsel__add_hist_entry(struct perf_tool 
*tool,
 {
        struct perf_report *rep = container_of(tool, struct perf_report, tool);
        struct symbol *parent = NULL;
-       int err = 0;
        struct hist_entry *he;
+       int err = report__resolve_callchain(rep, &parent, evsel, al, sample, 
machine);
 
-       if ((sort__has_parent || symbol_conf.use_callchain) && 
sample->callchain) {
-               err = machine__resolve_callchain(machine, evsel, al->thread,
-                                                sample, &parent, al,
-                                                rep->max_stack);
-               if (err)
-                       return err;
-       }
+       if (err)
+               return err;
 
        he = __hists__add_entry(&evsel->hists, al, parent, NULL, NULL,
                                sample->period, sample->weight,
@@ -233,17 +228,14 @@ static int perf_evsel__add_hist_entry(struct perf_tool 
*tool,
        if (he == NULL)
                return -ENOMEM;
 
-       if (symbol_conf.use_callchain) {
-               err = callchain_append(he->callchain,
-                                      &callchain_cursor,
-                                      sample->period);
-               if (err)
-                       return err;
-       }
+       err = hist_entry__append_callchain(he, sample);
+       if (err)
+               goto out;
 
        err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
        evsel->hists.stats.total_period += sample->period;
        hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
+out:
        return err;
 }
 
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to