Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S938957AbcKWRpJ (ORCPT ); Wed, 23 Nov 2016 12:45:09 -0500 Received: from mga03.intel.com ([134.134.136.65]:50574 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S938792AbcKWRpD (ORCPT ); Wed, 23 Nov 2016 12:45:03 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,539,1473145200"; d="scan'208";a="1072653005" From: kan.liang@intel.com To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, linux-kernel@vger.kernel.org Cc: alexander.shishkin@linux.intel.com, tglx@linutronix.de, namhyung@kernel.org, jolsa@kernel.org, adrian.hunter@intel.com, wangnan0@huawei.com, mark.rutland@arm.com, andi@firstfloor.org, Kan Liang Subject: [PATCH 14/14] perf script: show overhead events Date: Wed, 23 Nov 2016 04:44:52 -0500 Message-Id: <1479894292-16277-15-git-send-email-kan.liang@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1479894292-16277-1-git-send-email-kan.liang@intel.com> References: <1479894292-16277-1-git-send-email-kan.liang@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5294 Lines: 149 From: Kan Liang Introduce a new option --show-overhead to show overhead events in perf script Signed-off-by: Kan Liang --- tools/perf/builtin-script.c | 36 ++++++++++++++++++++++++++++++++++++ tools/perf/util/event.c | 37 +++++++++++++++++++++++++++++++++++++ tools/perf/util/event.h | 1 + 3 files changed, 74 insertions(+) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index e1daff3..76d9747 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -829,6 +829,7 @@ struct perf_script { bool show_task_events; bool show_mmap_events; bool show_switch_events; + bool show_overhead; bool allocated; struct cpu_map *cpus; struct thread_map *threads; @@ -1264,6 +1265,37 @@ static int process_switch_event(struct perf_tool *tool, return 0; } +static int process_overhead_event(struct perf_tool *tool, + union perf_event *event, + struct perf_sample *sample, + struct machine *machine) +{ + struct thread *thread; + struct perf_script *script = container_of(tool, struct perf_script, tool); + struct perf_session *session = script->session; + struct perf_evsel *evsel; + + if (perf_event__process_switch(tool, event, sample, machine) < 0) + return -1; + if (sample) { + evsel = perf_evlist__id2evsel(session->evlist, sample->id); + thread = machine__findnew_thread(machine, sample->pid, sample->tid); + if (thread == NULL) { + pr_debug("problem processing OVERHEAD event, skipping it.\n"); + return -1; + } + + print_sample_start(sample, thread, evsel); + perf_event__fprintf(event, stdout); + thread__put(thread); + } else { + /* USER OVERHEAD event */ + perf_event__fprintf(event, stdout); + } + + return 0; +} + static void sig_handler(int sig __maybe_unused) { session_done = 1; @@ -1287,6 +1319,8 @@ static int __cmd_script(struct perf_script *script) } if (script->show_switch_events) script->tool.context_switch = process_switch_event; + if (script->show_overhead) + script->tool.overhead = process_overhead_event; ret = perf_session__process_events(script->session); @@ -2172,6 +2206,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused) "Show the mmap events"), OPT_BOOLEAN('\0', "show-switch-events", &script.show_switch_events, "Show context switch events (if recorded)"), + OPT_BOOLEAN('\0', "show-overhead", &script.show_overhead, + "Show overhead events"), OPT_BOOLEAN('f', "force", &file.force, "don't complain, do it"), OPT_BOOLEAN(0, "ns", &nanosecs, "Use 9 decimal places when displaying time"), diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 6cd43c9..cd4f3aa 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -1190,6 +1190,39 @@ size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp) event->context_switch.next_prev_tid); } +size_t perf_event__fprintf_overhead(union perf_event *event, FILE *fp) +{ + size_t ret; + + if (event->overhead.type == PERF_NMI_OVERHEAD) { + ret = fprintf(fp, " [NMI] nr: %llu time: %llu cpu %u\n", + event->overhead.entry.nr, + event->overhead.entry.time, + event->overhead.entry.cpu); + } else if (event->overhead.type == PERF_MUX_OVERHEAD) { + ret = fprintf(fp, " [MUX] nr: %llu time: %llu cpu %u\n", + event->overhead.entry.nr, + event->overhead.entry.time, + event->overhead.entry.cpu); + } else if (event->overhead.type == PERF_SB_OVERHEAD) { + ret = fprintf(fp, " [SB] nr: %llu time: %llu cpu %u\n", + event->overhead.entry.nr, + event->overhead.entry.time, + event->overhead.entry.cpu); + } else if (event->overhead.type == PERF_USER_WRITE_OVERHEAD) { + ret = fprintf(fp, " [USER WRITE] nr: %llu time: %llu cpu %u\n", + event->overhead.entry.nr, + event->overhead.entry.time, + event->overhead.entry.cpu); + } else if (event->overhead.type == PERF_USER_ELAPSED_TIME) { + ret = fprintf(fp, " [ELAPSED TIME] time: %llu\n", + event->overhead.entry.time); + } else { + ret = fprintf(fp, " unhandled!\n"); + } + return ret; +} + size_t perf_event__fprintf(union perf_event *event, FILE *fp) { size_t ret = fprintf(fp, "PERF_RECORD_%s", @@ -1219,6 +1252,10 @@ size_t perf_event__fprintf(union perf_event *event, FILE *fp) case PERF_RECORD_SWITCH_CPU_WIDE: ret += perf_event__fprintf_switch(event, fp); break; + case PERF_RECORD_OVERHEAD: + case PERF_RECORD_USER_OVERHEAD: + ret += perf_event__fprintf_overhead(event, fp); + break; default: ret += fprintf(fp, "\n"); } diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index ceb0968..36e295d 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -690,6 +690,7 @@ size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp); size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp); size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp); size_t perf_event__fprintf(union perf_event *event, FILE *fp); +size_t perf_event__fprintf_overhead(union perf_event *event, FILE *fp); u64 kallsyms__get_function_start(const char *kallsyms_filename, const char *symbol_name); -- 2.5.5