Messages in this thread Patch in this message | | | From | Jiri Olsa <> | Subject | [PATCH 17/21] perf script: Add support to display user data events | Date | Wed, 24 Jan 2018 12:51:39 +0100 |
| |
Adding option to display user data events:
$ perf script -F +misc,+tid --show-userdata-events ...
sched-messaging 1410 KD 28690.634993: 2164 cycles:ppp: ffffffff8985bb70 nmi_res ... sched-messaging 1410 KD 28690.635003: 8920 cycles:ppp: ffffffff891b5e70 __perf_ ... sched-messaging 1410 28690.635043: PERF_RECORD_USER_DATA type 0x20 (callchain) sched-messaging 1407 KD 28690.635117: 319262 cycles:ppp: ffffffff89206c3c copy_pa ... sched-messaging 1407 28690.635226: PERF_RECORD_USER_DATA type 0x20 (callchain) sched-messaging 1411 KD 28690.635318: 1 cycles:ppp: ffffffff8905aa54 native_ ...
Link: http://lkml.kernel.org/n/tip-ozg2qt7ofv69e1hddxwuf0hp@git.kernel.org Signed-off-by: Jiri Olsa <jolsa@kernel.org> --- tools/perf/builtin-script.c | 85 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+)
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index ab19a6ee4093..2b8231292fe2 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -1489,6 +1489,7 @@ struct perf_script { bool show_switch_events; bool show_namespace_events; bool show_lost_events; + bool show_userdata_events; bool allocated; bool per_event_dump; struct cpu_map *cpus; @@ -2104,6 +2105,85 @@ process_lost_event(struct perf_tool *tool, return 0; } +static size_t +perf_event__fprintf_user_data(union perf_event *event, + struct perf_sample *sample, + struct perf_evsel *evsel, + struct perf_script *script, + FILE *fp) +{ + const char *evname = perf_evsel__name(evsel); + u64 type = event->user_data.type; + bool single = true; + size_t printed = 0; + + printed += fprintf(fp, "PERF_RECORD_%s ", + perf_event__name(event->header.type)); + + if (!script->name_width) + script->name_width = perf_evlist__max_name_len(script->session->evlist); + + printed += fprintf(fp, "%*s: ", script->name_width, evname ?: "[unknown]"); + + printed += fprintf(fp, " id %lu, type 0x%lx (", + sample->user_data_id, event->user_data.type); + + if (type & PERF_SAMPLE_CALLCHAIN) { + printed += fprintf(fp, "callchain"); + single = false; + } + + if (type & PERF_SAMPLE_STACK_USER) { + printed += fprintf(fp, "%sstack", !single ? "," : ""); + single = false; + } + + if (type & PERF_SAMPLE_USER_DATA_ID) + printed += fprintf(fp, "%sid", !single ? "," : ""); + + printed += fprintf(fp, ")\n"); + return printed; +} + +static int +process_user_data_event(struct perf_tool *tool __maybe_unused, + union perf_event *event __maybe_unused, + struct perf_sample *sample, + struct perf_evsel *evsel, + struct machine *machine) +{ + struct perf_script *script = container_of(tool, struct perf_script, tool); + struct perf_event_attr *attr = &evsel->attr; + unsigned int type = output_type(attr->type); + struct thread *thread; + + thread = machine__findnew_thread(machine, sample->pid, + sample->tid); + if (thread == NULL) + return -1; + + perf_sample__fprintf_start(sample, thread, evsel, + PERF_RECORD_SAMPLE, stdout); + perf_event__fprintf_user_data(event, sample, evsel, script, stdout); + + if (PRINT_FIELD(IP)) { + struct callchain_cursor *cursor = NULL; + + if (symbol_conf.use_callchain && sample->callchain && + thread__resolve_callchain(thread, &callchain_cursor, evsel, + sample, NULL, NULL, scripting_max_stack) == 0) + cursor = &callchain_cursor; + + if (cursor) { + sample__fprintf_callchain(sample, 0, output[type].print_ip_opts, cursor, stdout); + fprintf(stdout, "\n"); + } + } + + thread__put(thread); + return 0; +} + static void sig_handler(int sig __maybe_unused) { session_done = 1; @@ -2200,6 +2280,9 @@ static int __cmd_script(struct perf_script *script) script->tool.namespaces = process_namespaces_event; if (script->show_lost_events) script->tool.lost = process_lost_event; + if (script->show_userdata_events) + script->tool.user_data = process_user_data_event; + if (perf_script__setup_per_event_dump(script)) { pr_err("Couldn't create the per event dump files\n"); @@ -3139,6 +3222,8 @@ int cmd_script(int argc, const char **argv) "Show namespace events (if recorded)"), OPT_BOOLEAN('\0', "show-lost-events", &script.show_lost_events, "Show lost events (if recorded)"), + OPT_BOOLEAN('\0', "show-userdata-events", &script.show_userdata_events, + "Show userdata events (if recorded)"), OPT_BOOLEAN('\0', "per-event-dump", &script.per_event_dump, "Dump trace output to files named by the monitored events"), OPT_BOOLEAN('f', "force", &symbol_conf.force, "don't complain, do it"), -- 2.13.6
| |