perf callchains: Ask for PERF_RECORD_MMAP for data mmaps for DWARF unwinding
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-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]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/evsel.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
tools/perf/util/evsel.c +13 -3
@@ -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, ¶m); + } } }
@@ -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; }