Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755492AbcLBVVp (ORCPT ); Fri, 2 Dec 2016 16:21:45 -0500 Received: from mga05.intel.com ([192.55.52.43]:13792 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751743AbcLBVUn (ORCPT ); Fri, 2 Dec 2016 16:20:43 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,288,1477983600"; d="scan'208";a="1093847517" 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 V2 06/13] perf tools: option to disable overhead collection Date: Fri, 2 Dec 2016 16:19:14 -0500 Message-Id: <1480713561-6617-7-git-send-email-kan.liang@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1480713561-6617-1-git-send-email-kan.liang@intel.com> References: <1480713561-6617-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: 4365 Lines: 136 From: Kan Liang Perf collects overhead information by default. A new option --no-profile-cost-info is introduced to disable the information collection. Signed-off-by: Kan Liang --- tools/include/uapi/linux/perf_event.h | 42 +++++++++++++++++++++++++++++++- tools/perf/Documentation/perf-record.txt | 6 +++++ tools/perf/builtin-record.c | 2 ++ tools/perf/perf.h | 1 + tools/perf/util/evsel.c | 1 + 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h index c66a485..bdf2eec 100644 --- a/tools/include/uapi/linux/perf_event.h +++ b/tools/include/uapi/linux/perf_event.h @@ -344,7 +344,8 @@ struct perf_event_attr { use_clockid : 1, /* use @clockid for time fields */ context_switch : 1, /* context switch data */ write_backward : 1, /* Write ring buffer from end to beginning */ - __reserved_1 : 36; + overhead : 1, /* Log overhead information */ + __reserved_1 : 35; union { __u32 wakeup_events; /* wakeup every n events */ @@ -862,6 +863,17 @@ enum perf_event_type { */ PERF_RECORD_SWITCH_CPU_WIDE = 15, + /* + * Records perf overhead + * struct { + * struct perf_event_header header; + * u64 type; + * struct perf_overhead_entry entry; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_OVERHEAD = 16, + PERF_RECORD_MAX, /* non-ABI */ }; @@ -980,4 +992,32 @@ struct perf_branch_entry { reserved:44; }; +/* + * The overhead type could be different among architectures. + * The common overhead type can be defined from PERF_CORE_OVERHEAD + * The arch specific type should be defined from PERF_PMU_OVERHEAD + */ +enum perf_record_overhead_type { + PERF_CORE_OVERHEAD = 0, + PERF_CORE_MUX_OVERHEAD = 0, + PERF_CORE_SB_OVERHEAD, + + PERF_PMU_OVERHEAD = 20, + PERF_PMU_SAMPLE_OVERHEAD = 20, + + PERF_OVERHEAD_MAX, +}; + +/* + * single overhead record layout: + * + * nr: Times of overhead happens. + * E.g. for NMI, nr == times of NMI handler are called. + * time: Total overhead cost(ns) + */ +struct perf_overhead_entry { + __u64 nr; + __u64 time; +}; + #endif /* _UAPI_LINUX_PERF_EVENT_H */ diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt index 27fc361..29a57f9 100644 --- a/tools/perf/Documentation/perf-record.txt +++ b/tools/perf/Documentation/perf-record.txt @@ -460,6 +460,12 @@ config terms. For example: 'cycles/overwrite/' and 'instructions/no-overwrite/'. Implies --tail-synthesize. +--no-profile-cost-info:: +Perf collects profiling time cost by default. +The time cost includes sampling overhead, multiplexing overhead, side-band +events overhead and so on. +This option disable the profiling time cost information collection. + SEE ALSO -------- linkperf:perf-stat[1], linkperf:perf-list[1] diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 67d2a90..73b033b 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -1512,6 +1512,8 @@ struct option __record_options[] = { "Switch output when receive SIGUSR2"), OPT_BOOLEAN(0, "dry-run", &dry_run, "Parse options then exit"), + OPT_BOOLEAN(0, "no-profile-cost-info", &record.opts.no_profile_cost, + "Do not collect perf profiling time cost information"), OPT_END() }; diff --git a/tools/perf/perf.h b/tools/perf/perf.h index 9a0236a..59b16d3 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h @@ -55,6 +55,7 @@ struct record_opts { bool all_user; bool tail_synthesize; bool overwrite; + bool no_profile_cost; unsigned int freq; unsigned int mmap_pages; unsigned int auxtrace_mmap_pages; diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index b2365a63..146c191 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -817,6 +817,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts, attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1; attr->inherit = !opts->no_inherit; attr->write_backward = opts->overwrite ? 1 : 0; + attr->overhead = !opts->no_profile_cost; perf_evsel__set_sample_bit(evsel, IP); perf_evsel__set_sample_bit(evsel, TID); -- 2.5.5