Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756812AbcKXQWF (ORCPT ); Thu, 24 Nov 2016 11:22:05 -0500 Received: from foss.arm.com ([217.140.101.70]:57556 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752936AbcKXQWD (ORCPT ); Thu, 24 Nov 2016 11:22:03 -0500 Date: Thu, 24 Nov 2016 16:21:35 +0000 From: Mark Rutland To: kan.liang@intel.com Cc: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, linux-kernel@vger.kernel.org, alexander.shishkin@linux.intel.com, tglx@linutronix.de, namhyung@kernel.org, jolsa@kernel.org, adrian.hunter@intel.com, wangnan0@huawei.com, andi@firstfloor.org Subject: Re: [PATCH 04/14] perf/x86: output side-band events overhead Message-ID: <20161124162135.GB2444@remoulade> References: <1479894292-16277-1-git-send-email-kan.liang@intel.com> <1479894292-16277-5-git-send-email-kan.liang@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1479894292-16277-5-git-send-email-kan.liang@intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3571 Lines: 122 On Wed, Nov 23, 2016 at 04:44:42AM -0500, kan.liang@intel.com wrote: > From: Kan Liang > > Iterating all events which need to receive side-band events also bring > some overhead. > Save the overhead information in task context or CPU context, whichever > context is available. Do we really want to expose this concept to userspace? What if the implementation changes? Thanks, Mark. > Signed-off-by: Kan Liang > --- > include/linux/perf_event.h | 2 ++ > include/uapi/linux/perf_event.h | 1 + > kernel/events/core.c | 32 ++++++++++++++++++++++++++++---- > 3 files changed, 31 insertions(+), 4 deletions(-) > > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h > index f72b97a..ec3cb7f 100644 > --- a/include/linux/perf_event.h > +++ b/include/linux/perf_event.h > @@ -764,6 +764,8 @@ struct perf_event_context { > #endif > void *task_ctx_data; /* pmu specific data */ > struct rcu_head rcu_head; > + > + struct perf_overhead_entry sb_overhead; > }; > > /* > diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h > index 9124c7c..5e7c522 100644 > --- a/include/uapi/linux/perf_event.h > +++ b/include/uapi/linux/perf_event.h > @@ -994,6 +994,7 @@ struct perf_branch_entry { > enum perf_record_overhead_type { > PERF_NMI_OVERHEAD = 0, > PERF_MUX_OVERHEAD, > + PERF_SB_OVERHEAD, > > PERF_OVERHEAD_MAX, > }; > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 9934059..51e9df7 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -1829,9 +1829,15 @@ event_sched_out(struct perf_event *event, > if (event->attr.exclusive || !cpuctx->active_oncpu) > cpuctx->exclusive = 0; > > - if (log_overhead && cpuctx->mux_overhead.nr) { > - cpuctx->mux_overhead.cpu = smp_processor_id(); > - perf_log_overhead(event, PERF_MUX_OVERHEAD, &cpuctx->mux_overhead); > + if (log_overhead) { > + if (cpuctx->mux_overhead.nr) { > + cpuctx->mux_overhead.cpu = smp_processor_id(); > + perf_log_overhead(event, PERF_MUX_OVERHEAD, &cpuctx->mux_overhead); > + } > + if (ctx->sb_overhead.nr) { > + ctx->sb_overhead.cpu = smp_processor_id(); > + perf_log_overhead(event, PERF_SB_OVERHEAD, &ctx->sb_overhead); > + } > } > > perf_pmu_enable(event->pmu); > @@ -6133,6 +6139,14 @@ static void perf_iterate_sb_cpu(perf_iterate_f output, void *data) > } > } > > +static void > +perf_caculate_sb_overhead(struct perf_event_context *ctx, > + u64 time) > +{ > + ctx->sb_overhead.nr++; > + ctx->sb_overhead.time += time; > +} > + > /* > * Iterate all events that need to receive side-band events. > * > @@ -6143,9 +6157,12 @@ 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_event_context *ctx; > + u64 start_clock, end_clock; > int ctxn; > > + start_clock = perf_clock(); > rcu_read_lock(); > preempt_disable(); > > @@ -6163,12 +6180,19 @@ 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(); > + > + end_clock = perf_clock(); > + if (overhead_ctx) > + perf_caculate_sb_overhead(overhead_ctx, end_clock - start_clock); > } > > /* > -- > 2.5.5 >