From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755524AbcAHPic (ORCPT ); Fri, 8 Jan 2016 10:38:32 -0500 Received: from mail.kernel.org ([198.145.29.136]:52384 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751167AbcAHPib (ORCPT ); Fri, 8 Jan 2016 10:38:31 -0500 Date: Fri, 8 Jan 2016 12:38:26 -0300 From: Arnaldo Carvalho de Melo To: Namhyung Kim Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Andi Kleen , Frederic Weisbecker Subject: Re: [PATCH] perf top: Decay periods in callchains Message-ID: <20160108153826.GH19314@kernel.org> References: <1451963160-17196-1-git-send-email-namhyung@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1451963160-17196-1-git-send-email-namhyung@kernel.org> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Tue, Jan 05, 2016 at 12:06:00PM +0900, Namhyung Kim escreveu: > It missed to decay periods in callchains when decaying hist entries. > This resulted in more than 100 percent overhead in callchains in the > fractal style output. Thanks, applied! > Reported-by: Arnaldo Carvalho de Melo > Signed-off-by: Namhyung Kim > --- > tools/perf/util/callchain.c | 28 ++++++++++++++++++++++++++++ > tools/perf/util/callchain.h | 1 + > tools/perf/util/hist.c | 1 + > 3 files changed, 30 insertions(+) > > diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c > index 564377d2bebf..53c43eb9489e 100644 > --- a/tools/perf/util/callchain.c > +++ b/tools/perf/util/callchain.c > @@ -925,6 +925,34 @@ void free_callchain(struct callchain_root *root) > free_callchain_node(&root->node); > } > > +static u64 decay_callchain_node(struct callchain_node *node) > +{ > + struct callchain_node *child; > + struct rb_node *n; > + u64 child_hits = 0; > + > + n = rb_first(&node->rb_root_in); > + while (n) { > + child = container_of(n, struct callchain_node, rb_node_in); > + > + child_hits += decay_callchain_node(child); > + n = rb_next(n); > + } > + > + node->hit = (node->hit * 7) / 8; > + node->children_hit = child_hits; > + > + return node->hit; > +} > + > +void decay_callchain(struct callchain_root *root) > +{ > + if (!symbol_conf.use_callchain) > + return; > + > + decay_callchain_node(&root->node); > +} > + > int callchain_node__make_parent_list(struct callchain_node *node) > { > struct callchain_node *parent = node->parent; > diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h > index 8ac8f043004c..18dd22269764 100644 > --- a/tools/perf/util/callchain.h > +++ b/tools/perf/util/callchain.h > @@ -253,6 +253,7 @@ int callchain_node__fprintf_value(struct callchain_node *node, > FILE *fp, u64 total); > > void free_callchain(struct callchain_root *root); > +void decay_callchain(struct callchain_root *root); > int callchain_node__make_parent_list(struct callchain_node *node); > > #endif /* __PERF_CALLCHAIN_H */ > diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c > index afc9b8f1b36c..888776b43cb0 100644 > --- a/tools/perf/util/hist.c > +++ b/tools/perf/util/hist.c > @@ -254,6 +254,7 @@ static bool hists__decay_entry(struct hists *hists, struct hist_entry *he) > he_stat__decay(&he->stat); > if (symbol_conf.cumulate_callchain) > he_stat__decay(he->stat_acc); > + decay_callchain(he->callchain); > > diff = prev_period - he->stat.period; > > -- > 2.6.4