Commit-ID:  0d3dcc0ef13d9d78132d7d6ae068c17ed858e65e
Gitweb:     https://git.kernel.org/tip/0d3dcc0ef13d9d78132d7d6ae068c17ed858e65e
Author:     Arnaldo Carvalho de Melo <[email protected]>
AuthorDate: Tue, 16 Jan 2018 11:16:25 -0300
Committer:  Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Wed, 17 Jan 2018 10:23:33 -0300

perf callchains: Ask for PERF_RECORD_MMAP for data mmaps for DWARF unwinding

When we use a global DWARF setting as in:

        perf record --call-graph dwarf

According to 5c0cf22477ea ("perf record: Store data mmaps for dwarf unwind") we 
need
to set up some extra perf_event_attr bits.

But when we instead do a per event dwarf setting:

        perf record -e cycles/call-graph=dwarf/

This was not being done, make them equivalent.

This didn't produce any output changes in my tests while fixing up loose
ends in the per-event settings, I found it just by comparing the
perf_event_attr fields trying to find an explanation for those problems.

Cc: Adrian Hunter <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Hendrick Brueckner <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Noel Grandin <[email protected]>
Cc: Thomas Richter <[email protected]>
Cc: Wang Nan <[email protected]>
Link: https://lkml.kernel.org/n/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
 tools/perf/util/evsel.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 8f971a2..85eb84d 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -726,7 +726,7 @@ perf_evsel__reset_callgraph(struct perf_evsel *evsel,
 }
 
 static void apply_config_terms(struct perf_evsel *evsel,
-                              struct record_opts *opts)
+                              struct record_opts *opts, bool track)
 {
        struct perf_evsel_config_term *term;
        struct list_head *config_terms = &evsel->config_terms;
@@ -797,6 +797,8 @@ static void apply_config_terms(struct perf_evsel *evsel,
 
        /* User explicitly set per-event callgraph, clear the old setting and 
reset. */
        if ((callgraph_buf != NULL) || (dump_size > 0) || max_stack) {
+               bool sample_address = false;
+
                if (max_stack) {
                        param.max_stack = max_stack;
                        if (callgraph_buf == NULL)
@@ -816,6 +818,8 @@ static void apply_config_terms(struct perf_evsel *evsel,
                                               evsel->name);
                                        return;
                                }
+                               if (param.record_mode == CALLCHAIN_DWARF)
+                                       sample_address = true;
                        }
                }
                if (dump_size > 0) {
@@ -828,8 +832,14 @@ static void apply_config_terms(struct perf_evsel *evsel,
                        perf_evsel__reset_callgraph(evsel, &callchain_param);
 
                /* set perf-event callgraph */
-               if (param.enabled)
+               if (param.enabled) {
+                       if (sample_address) {
+                               perf_evsel__set_sample_bit(evsel, ADDR);
+                               perf_evsel__set_sample_bit(evsel, DATA_SRC);
+                               evsel->attr.mmap_data = track;
+                       }
                        perf_evsel__config_callchain(evsel, opts, &param);
+               }
        }
 }
 
@@ -1060,7 +1070,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct 
record_opts *opts,
         * Apply event specific term settings,
         * it overloads any global configuration.
         */
-       apply_config_terms(evsel, opts);
+       apply_config_terms(evsel, opts, track);
 
        evsel->ignore_missing_thread = opts->ignore_missing_thread;
 }

Reply via email to