Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932764AbcLHV22 (ORCPT ); Thu, 8 Dec 2016 16:28:28 -0500 Received: from mga06.intel.com ([134.134.136.31]:42187 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932559AbcLHV20 (ORCPT ); Thu, 8 Dec 2016 16:28:26 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,321,1477983600"; d="scan'208";a="40528648" 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 V3 5/6] perf/core: calculate side-band events overhead Date: Thu, 8 Dec 2016 16:27:13 -0500 Message-Id: <1481232434-3574-6-git-send-email-kan.liang@intel.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1481232434-3574-1-git-send-email-kan.liang@intel.com> References: <1481232434-3574-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: 2015 Lines: 71 From: Kan Liang Iterating all events which need to receive side-band events also bring some overhead. The side-band events overhead PERF_CORE_SB_OVERHEAD is a common overhead type. Signed-off-by: Kan Liang --- include/uapi/linux/perf_event.h | 1 + kernel/events/core.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index c488336..7ba6d30 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -1002,6 +1002,7 @@ struct perf_branch_entry { enum perf_record_overhead_type { /* common overhead */ PERF_CORE_MUX_OVERHEAD = 0, + PERF_CORE_SB_OVERHEAD, /* PMU specific */ PERF_OVERHEAD_MAX, }; diff --git a/kernel/events/core.c b/kernel/events/core.c index 28468ae..335b1e2 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -6134,9 +6134,13 @@ static void perf_iterate_sb(perf_iterate_f output, void *data, struct perf_event_context *task_ctx) { + struct perf_event_context *overhead_ctx = task_ctx; + struct perf_cpu_context *cpuctx; struct perf_event_context *ctx; + u64 start_clock, end_clock; int ctxn; + start_clock = perf_clock(); rcu_read_lock(); preempt_disable(); @@ -6154,12 +6158,23 @@ perf_iterate_sb(perf_iterate_f output, void *data, for_each_task_context_nr(ctxn) { ctx = rcu_dereference(current->perf_event_ctxp[ctxn]); - if (ctx) + if (ctx) { perf_iterate_ctx(ctx, output, data, false); + if (!overhead_ctx) + overhead_ctx = ctx; + } } done: preempt_enable(); rcu_read_unlock(); + + /* calculate side-band event overhead */ + end_clock = perf_clock(); + if (overhead_ctx && overhead_ctx->pmu && overhead_ctx->pmu->stat) { + cpuctx = this_cpu_ptr(overhead_ctx->pmu->pmu_cpu_context); + cpuctx->overhead[PERF_CORE_SB_OVERHEAD].nr++; + cpuctx->overhead[PERF_CORE_SB_OVERHEAD].time += end_clock - start_clock; + } } /* -- 2.4.3