Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965105AbcKWRrG (ORCPT ); Wed, 23 Nov 2016 12:47:06 -0500 Received: from mga14.intel.com ([192.55.52.115]:15925 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S938644AbcKWRpA (ORCPT ); Wed, 23 Nov 2016 12:45:00 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,539,1473145200"; d="scan'208";a="1072652955" 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 06/14] perf tools: show NMI overhead Date: Wed, 23 Nov 2016 04:44:44 -0500 Message-Id: <1479894292-16277-7-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: 4240 Lines: 120 From: Kan Liang Caculate the total NMI overhead on each CPU, and display them in perf report Signed-off-by: Kan Liang --- tools/perf/builtin-report.c | 11 +++++++++++ tools/perf/util/event.h | 4 ++++ tools/perf/util/machine.c | 9 +++++++++ tools/perf/util/session.c | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 1416c39..b1437586 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -365,11 +365,22 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist, struct report *rep, const char *help) { + struct perf_session *session = rep->session; struct perf_evsel *pos; + int cpu; fprintf(stdout, "#\n# Total Lost Samples: %" PRIu64 "\n#\n", evlist->stats.total_lost_samples); if (symbol_conf.show_overhead) { fprintf(stdout, "# Overhead:\n"); + for (cpu = 0; cpu < session->header.env.nr_cpus_online; cpu++) { + if (!evlist->stats.total_nmi_overhead[cpu][0]) + continue; + if (rep->cpu_list && !test_bit(cpu, rep->cpu_bitmap)) + continue; + fprintf(stdout, "#\tCPU %d: NMI#: %" PRIu64 " time: %" PRIu64 " ns\n", + cpu, evlist->stats.total_nmi_overhead[cpu][0], + evlist->stats.total_nmi_overhead[cpu][1]); + } fprintf(stdout, "#\n"); } evlist__for_each_entry(evlist, pos) { diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index d1b179b..7d40d54 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -262,6 +262,9 @@ enum auxtrace_error_type { * multipling nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get * the total number of low level events, it is necessary to to sum all struct * sample_event.period and stash the result in total_period. + * + * The total_nmi_overhead tells exactly the NMI handler overhead on each CPU. + * The total NMI# is stored in [0], while the accumulated time is in [1]. */ struct events_stats { u64 total_period; @@ -270,6 +273,7 @@ struct events_stats { u64 total_lost_samples; u64 total_aux_lost; u64 total_invalid_chains; + u64 total_nmi_overhead[MAX_NR_CPUS][2]; u32 nr_events[PERF_RECORD_HEADER_MAX]; u32 nr_non_filtered_samples; u32 nr_lost_warned; diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 1101757..58076f2 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -558,6 +558,15 @@ int machine__process_switch_event(struct machine *machine __maybe_unused, int machine__process_overhead_event(struct machine *machine __maybe_unused, union perf_event *event __maybe_unused) { + if (event->overhead.type == PERF_NMI_OVERHEAD) { + dump_printf(" NMI nr: %llu time: %llu cpu %u\n", + event->overhead.entry.nr, + event->overhead.entry.time, + event->overhead.entry.cpu); + } else { + dump_printf("\tUNSUPPORT OVERHEAD TYPE 0x%x!\n", event->overhead.type); + } + return 0; } diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index bc0bc21..a79ab99 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1207,6 +1207,23 @@ static int &sample->read.one, machine); } +static void +overhead_stats_update(struct perf_tool *tool, + struct perf_evlist *evlist, + union perf_event *event) +{ + if (tool->overhead == perf_event__process_overhead) { + switch (event->overhead.type) { + case PERF_NMI_OVERHEAD: + evlist->stats.total_nmi_overhead[event->overhead.entry.cpu][0] += event->overhead.entry.nr; + evlist->stats.total_nmi_overhead[event->overhead.entry.cpu][1] += event->overhead.entry.time; + break; + default: + break; + } + } +} + static int machines__deliver_event(struct machines *machines, struct perf_evlist *evlist, union perf_event *event, @@ -1271,6 +1288,7 @@ static int machines__deliver_event(struct machines *machines, case PERF_RECORD_SWITCH_CPU_WIDE: return tool->context_switch(tool, event, sample, machine); case PERF_RECORD_OVERHEAD: + overhead_stats_update(tool, evlist, event); return tool->overhead(tool, event, sample, machine); default: ++evlist->stats.nr_unknown_events; -- 2.5.5