perf top: Decay periods in callchains
Namhyung Kim
maintainerPATCH 1/1 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 <[email protected]>
Signed-off-by Namhyung Kim <[email protected]>
--- tools/perf/util/callchain.c | 28 ++++++++++++++++++++++++++++ tools/perf/util/callchain.h | 1 + tools/perf/util/hist.c | 1 + 3 files changed, 30 insertions(+)
tools/perf/util/callchain.c +28 -0
@@ -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;
tools/perf/util/callchain.h +1 -0
@@ -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 */
tools/perf/util/hist.c +1 -0
@@ -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;
Signature · 1 line
2.6.4
Em Tue, Jan 05, 2016 at 12:06:00PM +0900, Namhyung Kim escreveu:
Quoted 3 lines
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!
Quoted 73 lines
Reported-by Arnaldo Carvalho de Melo <[email protected]>Signed-off-by Namhyung Kim <[email protected]>--- tools/perf/util/callchain.c | 28 ++++++++++++++++++++++++++++ tools/perf/util/callchain.h | 1 + tools/perf/util/hist.c | 1 + 3 files changed, 30 insertions(+)tools/perf/util/callchain.c +28
-0@@ -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;tools/perf/util/callchain.h +1
-0@@ -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 */ tools/perf/util/hist.c +1
-0@@ -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;Signature · 1 line
2.6.4
tip-bot for Namhyung Kim
merge botperf top: Decay periods in callchains
Commit-ID: 42b276a2351517409d55b1202a1fa8b05c0cdc99 Gitweb: http://git.kernel.org/tip/42b276a2351517409d55b1202a1fa8b05c0cdc99 Author: Namhyung Kim <[email protected]> AuthorDate: Tue, 5 Jan 2016 12:06:00 +0900 Committer: Arnaldo Carvalho de Melo <[email protected]> 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 <[email protected]>
Signed-off-by Namhyung Kim <[email protected]>
Cc Andi Kleen <[email protected]>
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Peter Zijlstra <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/callchain.c | 28 ++++++++++++++++++++++++++++ tools/perf/util/callchain.h | 1 + tools/perf/util/hist.c | 1 + 3 files changed, 30 insertions(+)
tools/perf/util/callchain.c +28 -0
@@ -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;
tools/perf/util/callchain.h +1 -0
@@ -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 */
tools/perf/util/hist.c +1 -0
@@ -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;