From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932117AbcAIQhG (ORCPT ); Sat, 9 Jan 2016 11:37:06 -0500 Received: from terminus.zytor.com ([198.137.202.10]:42198 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755726AbcAIQhD (ORCPT ); Sat, 9 Jan 2016 11:37:03 -0500 Date: Sat, 9 Jan 2016 08:36:34 -0800 From: tip-bot for Namhyung Kim Message-ID: Cc: acme@kernel.org, linux-kernel@vger.kernel.org, mingo@kernel.org, hpa@zytor.com, acme@redhat.com, andi@firstfloor.org, fweisbec@gmail.com, a.p.zijlstra@chello.nl, namhyung@kernel.org, jolsa@redhat.com, dsahern@gmail.com, tglx@linutronix.de Reply-To: namhyung@kernel.org, jolsa@redhat.com, a.p.zijlstra@chello.nl, tglx@linutronix.de, dsahern@gmail.com, acme@kernel.org, linux-kernel@vger.kernel.org, fweisbec@gmail.com, andi@firstfloor.org, acme@redhat.com, mingo@kernel.org, hpa@zytor.com In-Reply-To: <1451963160-17196-1-git-send-email-namhyung@kernel.org> References: <1451963160-17196-1-git-send-email-namhyung@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf top: Decay periods in callchains Git-Commit-ID: 42b276a2351517409d55b1202a1fa8b05c0cdc99 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 42b276a2351517409d55b1202a1fa8b05c0cdc99 Gitweb: http://git.kernel.org/tip/42b276a2351517409d55b1202a1fa8b05c0cdc99 Author: Namhyung Kim AuthorDate: Tue, 5 Jan 2016 12:06:00 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 8 Jan 2016 12:37:51 -0300 perf top: Decay periods in callchains 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. Reported-by: Arnaldo Carvalho de Melo Signed-off-by: Namhyung Kim Cc: Andi Kleen Cc: David Ahern Cc: Frederic Weisbecker Cc: Jiri Olsa Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1451963160-17196-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- 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 564377d..53c43eb 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 8ac8f043..18dd222 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 afc9b8f..888776b 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;