Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965359AbcKXTk6 convert rfc822-to-8bit (ORCPT ); Thu, 24 Nov 2016 14:40:58 -0500 Received: from mga05.intel.com ([192.55.52.43]:64449 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757325AbcKXTk5 (ORCPT ); Thu, 24 Nov 2016 14:40:57 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,543,1473145200"; d="scan'208";a="1073110430" From: "Liang, Kan" To: Mark Rutland 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" , "Hunter, Adrian" , "wangnan0@huawei.com" , "andi@firstfloor.org" Subject: RE: [PATCH 04/14] perf/x86: output side-band events overhead Thread-Topic: [PATCH 04/14] perf/x86: output side-band events overhead Thread-Index: AQHSRbFUM/ikSpgDXku9XnaqdH05CKDnzCeAgACguyA= Date: Thu, 24 Nov 2016 19:40:52 +0000 Message-ID: <37D7C6CF3E00A74B8858931C1DB2F07750CA2DAD@SHSMSX103.ccr.corp.intel.com> References: <1479894292-16277-1-git-send-email-kan.liang@intel.com> <1479894292-16277-5-git-send-email-kan.liang@intel.com> <20161124162135.GB2444@remoulade> In-Reply-To: <20161124162135.GB2444@remoulade> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZjM1MWFjMWItYmEwYy00NzBiLWFiZDUtM2Y2YWRhM2NhZTRhIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6ImpFaGFWd090VkhSK2sxZE9Qa3ZTN2pwUUJ2aW1vMUhUY2RCNHAxU25DVFU9In0= x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4130 Lines: 140 > > 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? The concept of side-band will be removed? I thought we just use the rb-tree to replace the list. I think no matter how do we implement it, we do need to calculate its overhead, unless the concept is gone, or it merged with other overhead type. Because based on my test, it brings big overhead on some cases. Thanks, Kan > > 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 > >