All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, Namhyung Kim <namhyung@kernel.org>,
	Andi Kleen <andi@firstfloor.org>, David Ahern <dsahern@gmail.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Stephane Eranian <eranian@google.com>,
	Wang Nan <wangnan0@huawei.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 17/31] perf hists: Add helper functions for hierarchy mode
Date: Wed, 24 Feb 2016 22:58:12 -0300	[thread overview]
Message-ID: <1456365506-5492-18-git-send-email-acme@kernel.org> (raw)
In-Reply-To: <1456365506-5492-1-git-send-email-acme@kernel.org>

From: Namhyung Kim <namhyung@kernel.org>

The rb_hierarchy_{next,prev,last} functions are to traverse all hist
entries in a hierarchy.  They will be used by various function which
supports hierarchy output.

As the rb_hierarchy_next() is used to traverse the whole hierarchy, it
sometime needs to visit entries regardless of current folding state.  So
add enum hierarchy_move_dir and pass it to __rb_hierarchy_next() for
those cases.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Pekka Enberg <penberg@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1456326830-30456-5-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/hist.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/hist.h | 16 +++++++++++++++
 2 files changed, 72 insertions(+)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 6ddac2fb29b5..358af7ed07af 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1500,6 +1500,62 @@ void hists__output_resort(struct hists *hists, struct ui_progress *prog)
 	output_resort(hists, prog, symbol_conf.use_callchain);
 }
 
+static bool can_goto_child(struct hist_entry *he, enum hierarchy_move_dir hmd)
+{
+	if (he->leaf || hmd == HMD_FORCE_SIBLING)
+		return false;
+
+	if (he->unfolded || hmd == HMD_FORCE_CHILD)
+		return true;
+
+	return false;
+}
+
+struct rb_node *rb_hierarchy_last(struct rb_node *node)
+{
+	struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node);
+
+	while (can_goto_child(he, HMD_NORMAL)) {
+		node = rb_last(&he->hroot_out);
+		he = rb_entry(node, struct hist_entry, rb_node);
+	}
+	return node;
+}
+
+struct rb_node *__rb_hierarchy_next(struct rb_node *node, enum hierarchy_move_dir hmd)
+{
+	struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node);
+
+	if (can_goto_child(he, hmd))
+		node = rb_first(&he->hroot_out);
+	else
+		node = rb_next(node);
+
+	while (node == NULL) {
+		he = he->parent_he;
+		if (he == NULL)
+			break;
+
+		node = rb_next(&he->rb_node);
+	}
+	return node;
+}
+
+struct rb_node *rb_hierarchy_prev(struct rb_node *node)
+{
+	struct hist_entry *he = rb_entry(node, struct hist_entry, rb_node);
+
+	node = rb_prev(node);
+	if (node)
+		return rb_hierarchy_last(node);
+
+	he = he->parent_he;
+	if (he == NULL)
+		return NULL;
+
+	return &he->rb_node;
+}
+
 static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h,
 				       enum hist_filter filter)
 {
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 044419b3be7c..5690906c154c 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -418,4 +418,20 @@ int perf_hist_config(const char *var, const char *value);
 
 void perf_hpp_list__init(struct perf_hpp_list *list);
 
+enum hierarchy_move_dir {
+	HMD_NORMAL,
+	HMD_FORCE_SIBLING,
+	HMD_FORCE_CHILD,
+};
+
+struct rb_node *rb_hierarchy_last(struct rb_node *node);
+struct rb_node *__rb_hierarchy_next(struct rb_node *node,
+				    enum hierarchy_move_dir hmd);
+struct rb_node *rb_hierarchy_prev(struct rb_node *node);
+
+static inline struct rb_node *rb_hierarchy_next(struct rb_node *node)
+{
+	return __rb_hierarchy_next(node, HMD_NORMAL);
+}
+
 #endif	/* __PERF_HIST_H */
-- 
2.5.0

  parent reply	other threads:[~2016-02-25  1:58 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-25  1:57 [GIT PULL 00/31] perf/core improvements and fixes Arnaldo Carvalho de Melo
2016-02-25  1:57 ` [PATCH 01/31] perf mem record: Check for memory events support Arnaldo Carvalho de Melo
2016-02-25  1:57 ` [PATCH 02/31] perf mem: Introduce perf_mem_events__name function Arnaldo Carvalho de Melo
2016-02-25  1:57 ` [PATCH 03/31] perf tools: Introduce perf_mem__tlb_scnprintf function Arnaldo Carvalho de Melo
2016-02-25  1:57 ` [PATCH 04/31] perf tools: Introduce perf_mem__lvl_scnprintf function Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 05/31] perf tools: Introduce perf_mem__snp_scnprintf function Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 06/31] perf tools: Introduce perf_mem__lck_scnprintf function Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 07/31] perf tools: Change perf_mem__tlb_scnprintf to return nb of displayed bytes Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 08/31] perf tools: Change perf_mem__lvl_scnprintf " Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 09/31] perf tools: Change perf_mem__snp_scnprintf " Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 10/31] perf tools: Change perf_mem__lck_scnprintf " Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 11/31] perf script: Display data_src values Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 12/31] perf tools: Make binary data printer code in trace_event public available Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 13/31] perf script: Print bpf-output events in 'perf script' Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 14/31] perf tools: Add helper functions for some sort keys Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 15/31] perf hists: Basic support of hierarchical report view Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 16/31] perf hists: Resort hist entries with hierarchy Arnaldo Carvalho de Melo
2016-02-25  1:58 ` Arnaldo Carvalho de Melo [this message]
2016-02-25  1:58 ` [PATCH 18/31] perf hists: Introduce hist_entry__filter() Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 19/31] perf hists: Support filtering in hierarchy mode Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 20/31] perf hists: Resort after filtering hierarchy Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 21/31] perf hists: Count number of sort keys Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 22/31] perf ui/stdio: Implement hierarchy output mode Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 23/31] perf ui/stdio: Align column header for hierarchy output Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 24/31] perf hists browser: Count number of hierarchy entries Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 25/31] perf hists browser: Support collapsing/expanding whole entries in hierarchy Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 26/31] perf hists browser: Implement hierarchy output Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 27/31] perf hists browser: Align column header in hierarchy mode Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 28/31] perf ui/gtk: Implement hierarchy output mode Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 29/31] perf report: Add --hierarchy option Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 30/31] perf hists: Support decaying in hierarchy mode Arnaldo Carvalho de Melo
2016-02-25  1:58 ` [PATCH 31/31] perf top: Add --hierarchy option Arnaldo Carvalho de Melo
2016-02-25  7:22 ` [GIT PULL 00/31] perf/core improvements and fixes Ingo Molnar

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=1456365506-5492-18-git-send-email-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --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=namhyung@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.