perf script: Fix --call-trace for Intel PT
Make process_attr() respect -F-ip, noting also that the condition in process_attr() (callchain_param.record_mode != CALLCHAIN_NONE) is always true so test the sample type directly. Example: Before: $ perf record -e intel_pt//u uname Linux [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.033 MB perf.data ] $ perf script --call-trace | head -5 uname 30992 [006] 41758.313696574: cbr: 42 freq: 4219 MHz (156%) 0 [unknown] ([unknown] ) uname 30992 [006] 41758.313696907: _start 7f71792c4100 _start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) uname 30992 [006] 41758.313699574: _dl_start 7f71792c4103 _start+0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) uname 30992 [006] 41758.313699907: _dl_start 7f71792c4e18 _dl_start+0x28 (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) uname 30992 [006] 41758.313701574: _dl_start 7f71792c5128 _dl_start+0x338 (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) After: $ perf script --call-trace | head -5 uname 30992 [006] 41758.313696574: cbr: 42 freq: 4219 MHz (156%) uname 30992 [006] 41758.313696907: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _start uname 30992 [006] 41758.313699574: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _dl_start uname 30992 [006] 41758.313699907: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _dl_start uname 30992 [006] 41758.313701574: (/usr/lib/x86_64-linux-gnu/ld-2.31.so ) _dl_start Fixes: f288e8e1aa4f ("perf script: Enable IP fields for callchains") Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: http://lore.kernel.org/lkml/20200527180250.16723-1-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
87cf836073
Коммит
b51640854d
|
@ -167,6 +167,7 @@ static struct {
|
||||||
u64 fields;
|
u64 fields;
|
||||||
u64 invalid_fields;
|
u64 invalid_fields;
|
||||||
u64 user_set_fields;
|
u64 user_set_fields;
|
||||||
|
u64 user_unset_fields;
|
||||||
} output[OUTPUT_TYPE_MAX] = {
|
} output[OUTPUT_TYPE_MAX] = {
|
||||||
|
|
||||||
[PERF_TYPE_HARDWARE] = {
|
[PERF_TYPE_HARDWARE] = {
|
||||||
|
@ -2131,10 +2132,18 @@ static int process_attr(struct perf_tool *tool, union perf_event *event,
|
||||||
sample_type = perf_evlist__combined_sample_type(evlist);
|
sample_type = perf_evlist__combined_sample_type(evlist);
|
||||||
callchain_param_setup(sample_type);
|
callchain_param_setup(sample_type);
|
||||||
|
|
||||||
/* Enable fields for callchain entries, if it got enabled. */
|
/* Enable fields for callchain entries */
|
||||||
if (callchain_param.record_mode != CALLCHAIN_NONE) {
|
if (symbol_conf.use_callchain &&
|
||||||
output[output_type(evsel->core.attr.type)].fields |= PERF_OUTPUT_IP |
|
(sample_type & PERF_SAMPLE_CALLCHAIN ||
|
||||||
PERF_OUTPUT_SYM;
|
sample_type & PERF_SAMPLE_BRANCH_STACK ||
|
||||||
|
(sample_type & PERF_SAMPLE_REGS_USER &&
|
||||||
|
sample_type & PERF_SAMPLE_STACK_USER))) {
|
||||||
|
int type = output_type(evsel->core.attr.type);
|
||||||
|
|
||||||
|
if (!(output[type].user_unset_fields & PERF_OUTPUT_IP))
|
||||||
|
output[type].fields |= PERF_OUTPUT_IP;
|
||||||
|
if (!(output[type].user_unset_fields & PERF_OUTPUT_SYM))
|
||||||
|
output[type].fields |= PERF_OUTPUT_SYM;
|
||||||
}
|
}
|
||||||
set_print_ip_opts(&evsel->core.attr);
|
set_print_ip_opts(&evsel->core.attr);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2687,9 +2696,11 @@ parse:
|
||||||
if (change == REMOVE) {
|
if (change == REMOVE) {
|
||||||
output[j].fields &= ~all_output_options[i].field;
|
output[j].fields &= ~all_output_options[i].field;
|
||||||
output[j].user_set_fields &= ~all_output_options[i].field;
|
output[j].user_set_fields &= ~all_output_options[i].field;
|
||||||
|
output[j].user_unset_fields |= all_output_options[i].field;
|
||||||
} else {
|
} else {
|
||||||
output[j].fields |= all_output_options[i].field;
|
output[j].fields |= all_output_options[i].field;
|
||||||
output[j].user_set_fields |= all_output_options[i].field;
|
output[j].user_set_fields |= all_output_options[i].field;
|
||||||
|
output[j].user_unset_fields &= ~all_output_options[i].field;
|
||||||
}
|
}
|
||||||
output[j].user_set = true;
|
output[j].user_set = true;
|
||||||
output[j].wildcard_set = true;
|
output[j].wildcard_set = true;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче