From: Namhyung Kim <namhyung@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Jiri Olsa <jolsa@kernel.org>, LKML <linux-kernel@vger.kernel.org>,
David Ahern <dsahern@gmail.com>, Andi Kleen <andi@firstfloor.org>,
Stephane Eranian <eranian@google.com>,
Wang Nan <wangnan0@huawei.com>
Subject: [PATCH 09/23] perf hists: Basic support of hierarchical report view
Date: Fri, 5 Feb 2016 22:01:41 +0900 [thread overview]
Message-ID: <1454677315-7515-10-git-send-email-namhyung@kernel.org> (raw)
In-Reply-To: <1454677315-7515-1-git-send-email-namhyung@kernel.org>
In the hierarchical view, entries will be grouped and sorted on the
first key, and then second key, and so on. Add he->hroot_{in,out} field
to keep lower level entries. Actually this can be shared with callchain
sorted_root since the hroots are only used by non-leaf entries and
callchain is only used by leaf entries.
It also adds parent_he and depth fields which can be used by browsers.
This patch only implements collapsing part which creates internal
entries for each sort key. These need to be sorted by output_sort stage
and to be displayed properly in the later patch(es).
Acked-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/hist.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/sort.h | 13 ++++++-
tools/perf/util/symbol.h | 3 +-
3 files changed, 111 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index b4157d5d5252..cbf30d246204 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1025,6 +1025,99 @@ void hist_entry__delete(struct hist_entry *he)
* collapse the histogram
*/
+static void hists__apply_filters(struct hists *hists, struct hist_entry *he);
+
+static struct hist_entry *hierarchy_insert_entry(struct hists *hists,
+ struct rb_root *root,
+ struct hist_entry *he,
+ struct perf_hpp_fmt *fmt)
+{
+ struct rb_node **p = &root->rb_node;
+ struct rb_node *parent = NULL;
+ struct hist_entry *iter, *new;
+ int64_t cmp;
+
+ while (*p != NULL) {
+ parent = *p;
+ iter = rb_entry(parent, struct hist_entry, rb_node_in);
+
+ cmp = fmt->collapse(fmt, iter, he);
+ if (!cmp) {
+ he_stat__add_stat(&iter->stat, &he->stat);
+ return iter;
+ }
+
+ if (cmp < 0)
+ p = &parent->rb_left;
+ else
+ p = &parent->rb_right;
+ }
+
+ new = hist_entry__new(he, true);
+ if (new == NULL)
+ return NULL;
+
+ hists__apply_filters(hists, new);
+ hists->nr_entries++;
+
+ /* save related format for output */
+ new->fmt = fmt;
+
+ /* it's now passed to 'new' */
+ he->trace_output = NULL;
+
+ rb_link_node(&new->rb_node_in, parent, p);
+ rb_insert_color(&new->rb_node_in, root);
+ return new;
+}
+
+static int hists__hierarchy_insert_entry(struct hists *hists,
+ struct rb_root *root,
+ struct hist_entry *he)
+{
+ struct perf_hpp_fmt *fmt;
+ struct hist_entry *new_he = NULL;
+ struct hist_entry *parent = NULL;
+ int depth = 0;
+ int ret = 0;
+
+ hists__for_each_sort_list(hists, fmt) {
+ if (!perf_hpp__is_sort_entry(fmt) &&
+ !perf_hpp__is_dynamic_entry(fmt))
+ continue;
+
+ /* insert copy of 'he' for each fmt into the hierarchy */
+ new_he = hierarchy_insert_entry(hists, root, he, fmt);
+ if (new_he == NULL) {
+ ret = -1;
+ break;
+ }
+
+ root = &new_he->hroot_in;
+ new_he->parent_he = parent;
+ new_he->depth = depth++;
+ parent = new_he;
+ }
+
+ if (new_he) {
+ new_he->leaf = true;
+
+ if (symbol_conf.use_callchain) {
+ callchain_cursor_reset(&callchain_cursor);
+ if (callchain_merge(&callchain_cursor,
+ new_he->callchain,
+ he->callchain) < 0)
+ ret = -1;
+ }
+ }
+
+ /* 'he' is no longer used */
+ hist_entry__delete(he);
+
+ /* return 0 (or -1) since it already applied filters */
+ return ret;
+}
+
int hists__collapse_insert_entry(struct hists *hists, struct rb_root *root,
struct hist_entry *he)
{
@@ -1033,6 +1126,9 @@ int hists__collapse_insert_entry(struct hists *hists, struct rb_root *root,
struct hist_entry *iter;
int64_t cmp;
+ if (symbol_conf.report_hierarchy)
+ return hists__hierarchy_insert_entry(hists, root, he);
+
while (*p != NULL) {
parent = *p;
iter = rb_entry(parent, struct hist_entry, rb_node_in);
@@ -1063,6 +1159,7 @@ int hists__collapse_insert_entry(struct hists *hists, struct rb_root *root,
p = &(*p)->rb_right;
}
hists->nr_entries++;
+ he->leaf = true;
rb_link_node(&he->rb_node_in, parent, p);
rb_insert_color(&he->rb_node_in, root);
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 89a1273fd2da..0cdfd0cfe783 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -96,9 +96,11 @@ struct hist_entry {
s32 socket;
s32 cpu;
u8 cpumode;
+ u8 depth;
/* We are added by hists__add_dummy_entry. */
bool dummy;
+ bool leaf;
char level;
u8 filtered;
@@ -120,13 +122,22 @@ struct hist_entry {
char *srcline;
char *srcfile;
struct symbol *parent;
- struct rb_root sorted_chain;
struct branch_info *branch_info;
struct hists *hists;
struct mem_info *mem_info;
void *raw_data;
u32 raw_size;
void *trace_output;
+ struct perf_hpp_fmt *fmt;
+ struct hist_entry *parent_he;
+ union {
+ /* this is for hierarchical entry structure */
+ struct {
+ struct rb_root hroot_in;
+ struct rb_root hroot_out;
+ }; /* non-leaf entries */
+ struct rb_root sorted_chain; /* leaf entry has callchains */
+ };
struct callchain_root callchain[0]; /* must be last member */
};
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index ccd1caa40e11..a937053a0ae0 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -110,7 +110,8 @@ struct symbol_conf {
has_filter,
show_ref_callgraph,
hide_unresolved,
- raw_trace;
+ raw_trace,
+ report_hierarchy;
const char *vmlinux_name,
*kallsyms_name,
*source_prefix,
--
2.7.0
next prev parent reply other threads:[~2016-02-05 13:03 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-05 13:01 [PATCHSET 00/23] perf tools: Add support for hierachy view (v5) Namhyung Kim
2016-02-05 13:01 ` [PATCH 01/23] perf hists browser: Fix percentage update on key press Namhyung Kim
2016-02-05 13:01 ` [PATCH 02/23] perf callchain: Check return value of add_child() Namhyung Kim
2016-02-05 13:01 ` [PATCH 03/23] perf callchain: Check return value of fill_node() Namhyung Kim
2016-02-05 13:01 ` [PATCH 04/23] perf callchain: Add enum match_result for match_chain() Namhyung Kim
2016-02-05 13:01 ` [PATCH 05/23] perf callchain: Check return value of split_add_child() Namhyung Kim
2016-02-05 13:01 ` [PATCH 06/23] perf callchain: Check return value of append_chain_children() Namhyung Kim
2016-02-05 13:01 ` [PATCH 07/23] perf hists: Return error from hists__collapse_resort() Namhyung Kim
2016-02-05 13:01 ` [PATCH 08/23] perf report: Check error during report__collapse_hists() Namhyung Kim
2016-02-05 13:01 ` Namhyung Kim [this message]
2016-02-05 13:01 ` [PATCH 10/23] perf hists: Resort hist entries with hierarchy Namhyung Kim
2016-02-05 13:01 ` [PATCH 11/23] perf hists: Add helper functions for hierarchy mode Namhyung Kim
2016-02-05 13:01 ` [PATCH 12/23] perf hists: Introduce hist_entry__filter() Namhyung Kim
2016-02-05 13:01 ` [PATCH 13/23] perf hists: Support filtering in hierarchy mode Namhyung Kim
2016-02-10 11:51 ` Jiri Olsa
2016-02-10 14:00 ` Namhyung Kim
2016-02-10 12:11 ` Jiri Olsa
2016-02-10 14:16 ` Namhyung Kim
2016-02-05 13:01 ` [PATCH 14/23] perf ui/stdio: Implement hierarchy output mode Namhyung Kim
2016-02-09 22:01 ` Jiri Olsa
2016-02-10 14:21 ` Namhyung Kim
2016-02-10 12:13 ` Jiri Olsa
2016-02-10 14:25 ` Namhyung Kim
2016-02-10 12:23 ` Jiri Olsa
2016-02-10 12:29 ` Jiri Olsa
2016-02-10 14:27 ` Namhyung Kim
2016-02-05 13:01 ` [PATCH 15/23] perf ui/stdio: Align column header for hierarchy output Namhyung Kim
2016-02-10 12:40 ` Jiri Olsa
2016-02-10 14:32 ` Namhyung Kim
2016-02-05 13:01 ` [PATCH 16/23] perf hists browser: Count number of hierarchy entries Namhyung Kim
2016-02-10 12:52 ` Jiri Olsa
2016-02-10 14:42 ` Namhyung Kim
2016-02-05 13:01 ` [PATCH 17/23] perf hists browser: Support collapsing/expanding whole entries in hierarchy Namhyung Kim
2016-02-05 13:01 ` [PATCH 18/23] perf hists browser: Implement hierarchy output Namhyung Kim
2016-02-05 13:01 ` [PATCH 19/23] perf hists browser: Align column header in hierarchy mode Namhyung Kim
2016-02-05 13:01 ` [PATCH 20/23] perf ui/gtk: Implement hierarchy output mode Namhyung Kim
2016-02-05 13:01 ` [PATCH 21/23] perf report: Add --hierarchy option Namhyung Kim
2016-02-05 13:01 ` [PATCH 22/23] perf hists: Support decaying in hierarchy mode Namhyung Kim
2016-02-05 13:01 ` [PATCH 23/23] perf top: Add --hierarchy option Namhyung Kim
2016-02-09 22:37 ` Jiri Olsa
2016-02-10 13:19 ` Jiri Olsa
2016-02-10 14:46 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1454677315-7515-10-git-send-email-namhyung@kernel.org \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=andi@firstfloor.org \
--cc=dsahern@gmail.com \
--cc=eranian@google.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=wangnan0@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox