Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1261247 > unrolled thread

[PATCH 0/4] perf report: Support folded callchain output (v3)

Started byNamhyung Kim <namhyung@kernel.org>
First post2015-11-03 08:30 +0100
Last post2015-11-03 10:10 +0100
Articles 8 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 0/4] perf report: Support folded callchain output (v3) Namhyung Kim <namhyung@kernel.org> - 2015-11-03 08:30 +0100
    [PATCH v3 3/4] perf callchain: Add count fields to struct callchain_node Namhyung Kim <namhyung@kernel.org> - 2015-11-03 08:30 +0100
      Re: [PATCH v3 3/4] perf callchain: Add count fields to struct  callchain_node Jiri Olsa <jolsa@redhat.com> - 2015-11-03 10:10 +0100
    [PATCH v3 4/4] perf report: Add callchain value option Namhyung Kim <namhyung@kernel.org> - 2015-11-03 08:30 +0100
      Re: [PATCH v3 4/4] perf report: Add callchain value option Jiri Olsa <jolsa@redhat.com> - 2015-11-03 10:10 +0100
        Re: [PATCH v3 4/4] perf report: Add callchain value option Namhyung Kim <namhyung@kernel.org> - 2015-11-03 12:00 +0100
          Re: [PATCH v3 4/4] perf report: Add callchain value option Jiri Olsa <jolsa@redhat.com> - 2015-11-03 12:20 +0100
      Re: [PATCH v3 4/4] perf report: Add callchain value option Jiri Olsa <jolsa@redhat.com> - 2015-11-03 10:10 +0100

#1261247 — [PATCH 0/4] perf report: Support folded callchain output (v3)

FromNamhyung Kim <namhyung@kernel.org>
Date2015-11-03 08:30 +0100
Subject[PATCH 0/4] perf report: Support folded callchain output (v3)
Message-ID<qqEcy-83d-7@gated-at.bofh.it>
Hello,

This is what Brendan requested on the perf-users mailing list [1] to
support FlameGraphs [2] more efficiently.  This patchset adds a few
more callchain options to adjust the output for it.

 * changes in v3)
  - put the value before callchains
  - fix compile error


At first, 'folded' output mode was added.  The folded output puts the
value, a space and all calchain nodes separated by semicolons.  Now it
only supports --stdio as other UI provides some way of folding and/or
expanding callchains dynamically.

The value is now can be one of 'percent', 'period', or 'count'.  The
percent is current default output and the period is the raw number of
sample periods.  The count is the number of samples for each callchain.

Here's an example:

  $ perf report --no-children --show-nr-samples --stdio -g folded,count
  ...
    39.93%     80  swapper  [kernel.vmlinux]  [k] intel_idel
  57 intel_idle;cpuidle_enter_state;cpuidle_enter;call_cpuidle;cpu_startup_entry;start_secondary
  23 intel_idle;cpuidle_enter_state;cpuidle_enter;call_cpuidle;cpu_startup_entry;rest_init;...


  $ perf report --no-children --stdio -g percent
  ...
    39.93%  swapper  [kernel.vmlinux]  [k] intel_idel
            |
            ---intel_idle
               cpuidle_enter_state
               cpuidle_enter
               call_cpuidle
               cpu_startup_entry
               |
               |--28.63%-- start_secondary
               |
                --11.30%-- rest_init


  $ perf report --no-children --stdio --show-total-period -g period
  ...
    39.93%   13018705  swapper  [kernel.vmlinux]  [k] intel_idel
            |
            ---intel_idle
               cpuidle_enter_state
               cpuidle_enter
               call_cpuidle
               cpu_startup_entry
               |
               |--9334403-- start_secondary
               |
                --3684302-- rest_init


  $ perf report --no-children --stdio --show-nr-samples -g count
  ...
    39.93%     80  swapper  [kernel.vmlinux]  [k] intel_idel
            |
            ---intel_idle
               cpuidle_enter_state
               cpuidle_enter
               call_cpuidle
               cpu_startup_entry
               |
               |--57-- start_secondary
               |
                --23-- rest_init


You can get it from 'perf/callchain-fold-v3' branch on my tree:

  git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git

Any comments are welcome, thanks
Namhyung


[1] http://www.spinics.net/lists/linux-perf-users/msg02498.html
[2] http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html


Namhyung Kim (4):
  perf report: Support folded callchain mode on --stdio
  perf callchain: Abstract callchain print function
  perf callchain: Add count fields to struct callchain_node
  perf report: Add callchain value option

 tools/perf/Documentation/perf-report.txt | 13 +++--
 tools/perf/builtin-report.c              |  4 +-
 tools/perf/ui/browsers/hists.c           |  8 +--
 tools/perf/ui/gtk/hists.c                |  8 +--
 tools/perf/ui/stdio/hist.c               | 93 ++++++++++++++++++++++++++------
 tools/perf/util/callchain.c              | 87 +++++++++++++++++++++++++++++-
 tools/perf/util/callchain.h              | 24 ++++++++-
 tools/perf/util/util.c                   |  3 +-
 8 files changed, 205 insertions(+), 35 deletions(-)

-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1261249 — [PATCH v3 3/4] perf callchain: Add count fields to struct callchain_node

FromNamhyung Kim <namhyung@kernel.org>
Date2015-11-03 08:30 +0100
Subject[PATCH v3 3/4] perf callchain: Add count fields to struct callchain_node
Message-ID<qqEcy-83d-23@gated-at.bofh.it>
In reply to#1261247
It's to track the count of occurrences of the callchains.

Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/callchain.c | 10 ++++++++++
 tools/perf/util/callchain.h |  7 +++++++
 2 files changed, 17 insertions(+)

diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 44184d198855..0a97d77509bd 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -437,6 +437,8 @@ add_child(struct callchain_node *parent,
 
 	new->children_hit = 0;
 	new->hit = period;
+	new->children_count = 0;
+	new->count = 1;
 	return new;
 }
 
@@ -484,6 +486,9 @@ split_add_child(struct callchain_node *parent,
 	parent->children_hit = callchain_cumul_hits(new);
 	new->val_nr = parent->val_nr - idx_local;
 	parent->val_nr = idx_local;
+	new->count = parent->count;
+	new->children_count = parent->children_count;
+	parent->children_count = callchain_cumul_counts(new);
 
 	/* create a new child for the new branch if any */
 	if (idx_total < cursor->nr) {
@@ -494,6 +499,8 @@ split_add_child(struct callchain_node *parent,
 
 		parent->hit = 0;
 		parent->children_hit += period;
+		parent->count = 0;
+		parent->children_count += 1;
 
 		node = callchain_cursor_current(cursor);
 		new = add_child(parent, cursor, period);
@@ -516,6 +523,7 @@ split_add_child(struct callchain_node *parent,
 		rb_insert_color(&new->rb_node_in, &parent->rb_root_in);
 	} else {
 		parent->hit = period;
+		parent->count = 1;
 	}
 }
 
@@ -562,6 +570,7 @@ append_chain_children(struct callchain_node *root,
 
 inc_children_hit:
 	root->children_hit += period;
+	root->children_count++;
 }
 
 static int
@@ -614,6 +623,7 @@ append_chain(struct callchain_node *root,
 	/* we match 100% of the path, increment the hit */
 	if (matches == root->val_nr && cursor->pos == cursor->nr) {
 		root->hit += period;
+		root->count++;
 		return 0;
 	}
 
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 3a90a57f6213..2f948f0ff034 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -60,6 +60,8 @@ struct callchain_node {
 	struct rb_root		rb_root_in; /* input tree of children */
 	struct rb_root		rb_root;    /* sorted output tree of children */
 	unsigned int		val_nr;
+	unsigned int		count;
+	unsigned int		children_count;
 	u64			hit;
 	u64			children_hit;
 };
@@ -145,6 +147,11 @@ static inline u64 callchain_cumul_hits(struct callchain_node *node)
 	return node->hit + node->children_hit;
 }
 
+static inline int callchain_cumul_counts(struct callchain_node *node)
+{
+	return node->count + node->children_count;
+}
+
 int callchain_register_param(struct callchain_param *param);
 int callchain_append(struct callchain_root *root,
 		     struct callchain_cursor *cursor,
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1261318 — Re: [PATCH v3 3/4] perf callchain: Add count fields to struct callchain_node

FromJiri Olsa <jolsa@redhat.com>
Date2015-11-03 10:10 +0100
SubjectRe: [PATCH v3 3/4] perf callchain: Add count fields to struct callchain_node
Message-ID<qqFLk-Gf-23@gated-at.bofh.it>
In reply to#1261249
On Tue, Nov 03, 2015 at 04:18:30PM +0900, Namhyung Kim wrote:
> It's to track the count of occurrences of the callchains.
> 
> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>

Acked-by: Jiri Olsa <jolsa@kernel.org>

thanks,
jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1261254 — [PATCH v3 4/4] perf report: Add callchain value option

FromNamhyung Kim <namhyung@kernel.org>
Date2015-11-03 08:30 +0100
Subject[PATCH v3 4/4] perf report: Add callchain value option
Message-ID<qqEcz-83d-31@gated-at.bofh.it>
In reply to#1261247
Now -g/--call-graph option supports how to display callchain values.
Possible values are 'percent', 'period' and 'count'.  The percent is
same as before and it's the default behavior.  The period displays the
raw period value rather than the percentage.  The count displays the
number of occurrences.

  $ perf report --no-children --stdio -g percent
  ...
    39.93%  swapper  [kernel.vmlinux]  [k] intel_idel
            |
            ---intel_idle
               cpuidle_enter_state
               cpuidle_enter
               call_cpuidle
               cpu_startup_entry
               |
               |--28.63%-- start_secondary
               |
                --11.30%-- rest_init

  $ perf report --no-children --show-total-period --stdio -g period
  ...
    39.93%   13018705  swapper  [kernel.vmlinux]  [k] intel_idel
            |
            ---intel_idle
               cpuidle_enter_state
               cpuidle_enter
               call_cpuidle
               cpu_startup_entry
               |
               |--9334403-- start_secondary
               |
                --3684302-- rest_init

  $ perf report --no-children --show-nr-samples --stdio -g count
  ...
    39.93%     80  swapper  [kernel.vmlinux]  [k] intel_idel
            |
            ---intel_idle
               cpuidle_enter_state
               cpuidle_enter
               call_cpuidle
               cpu_startup_entry
               |
               |--57-- start_secondary
               |
                --23-- rest_init

Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/Documentation/perf-report.txt | 13 ++++---
 tools/perf/builtin-report.c              |  4 +--
 tools/perf/ui/stdio/hist.c               | 10 +++++-
 tools/perf/util/callchain.c              | 60 +++++++++++++++++++++++++++-----
 tools/perf/util/callchain.h              | 10 +++++-
 tools/perf/util/util.c                   |  3 +-
 6 files changed, 83 insertions(+), 17 deletions(-)

diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
index 5ce8da1e1256..bb9fd23a105e 100644
--- a/tools/perf/Documentation/perf-report.txt
+++ b/tools/perf/Documentation/perf-report.txt
@@ -170,11 +170,11 @@ OPTIONS
         Dump raw trace in ASCII.
 
 -g::
---call-graph=<print_type,threshold[,print_limit],order,sort_key,branch>::
+--call-graph=<print_type,threshold[,print_limit],order,sort_key[,branch],value>::
         Display call chains using type, min percent threshold, print limit,
-	call order, sort key and branch.  Note that ordering of parameters is not
-	fixed so any parement can be given in an arbitraty order.  One exception
-	is the print_limit which should be preceded by threshold.
+	call order, sort key, optional branch and value.  Note that ordering of
+	parameters is not fixed so any parement can be given in an arbitraty order.
+	One exception is the print_limit which should be preceded by threshold.
 
 	print_type can be either:
 	- flat: single column, linear exposure of call chains.
@@ -204,6 +204,11 @@ OPTIONS
 	- branch: include last branch information in callgraph when available.
 	          Usually more convenient to use --branch-history for this.
 
+	value can be:
+	- percent: diplay overhead percent (default)
+	- period: display event period
+	- count: display evnt count
+
 --children::
 	Accumulate callchain of children to parent entry so that then can
 	show up in the output.  The output will have a new "Children" column
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 2853ad2bd435..3dd4bb4ded1a 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -625,7 +625,7 @@ parse_percent_limit(const struct option *opt, const char *str,
 	return 0;
 }
 
-#define CALLCHAIN_DEFAULT_OPT  "graph,0.5,caller,function"
+#define CALLCHAIN_DEFAULT_OPT  "graph,0.5,caller,function,percent"
 
 const char report_callchain_help[] = "Display call graph (stack chain/backtrace):\n\n"
 				     CALLCHAIN_REPORT_HELP
@@ -708,7 +708,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
 	OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
 		    "Only display entries with parent-match"),
 	OPT_CALLBACK_DEFAULT('g', "call-graph", &report,
-			     "print_type,threshold[,print_limit],order,sort_key[,branch]",
+			     "print_type,threshold[,print_limit],order,sort_key[,branch],value",
 			     report_callchain_help, &report_parse_callchain_opt,
 			     callchain_default_opt),
 	OPT_BOOLEAN(0, "children", &symbol_conf.cumulate_callchain,
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index 9b5a0d8a43dc..c0580f5ea7ea 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -81,13 +81,14 @@ static size_t __callchain__fprintf_graph(FILE *fp, struct rb_root *root,
 					 int depth_mask, int left_margin)
 {
 	struct rb_node *node, *next;
-	struct callchain_node *child;
+	struct callchain_node *child = NULL;
 	struct callchain_list *chain;
 	int new_depth_mask = depth_mask;
 	u64 remaining;
 	size_t ret = 0;
 	int i;
 	uint entries_printed = 0;
+	int cumul_count = 0;
 
 	remaining = total_samples;
 
@@ -99,6 +100,7 @@ static size_t __callchain__fprintf_graph(FILE *fp, struct rb_root *root,
 		child = rb_entry(node, struct callchain_node, rb_node);
 		cumul = callchain_cumul_hits(child);
 		remaining -= cumul;
+		cumul_count += callchain_cumul_counts(child);
 
 		/*
 		 * The depth mask manages the output of pipes that show
@@ -148,6 +150,12 @@ static size_t __callchain__fprintf_graph(FILE *fp, struct rb_root *root,
 		if (!rem_sq_bracket)
 			return ret;
 
+		if (callchain_param.value == CCVAL_COUNT && child && child->parent) {
+			rem_node.count = child->parent->children_count - cumul_count;
+			if (rem_node.count <= 0)
+				return ret;
+		}
+
 		new_depth_mask &= ~(1 << (depth - 1));
 		ret += ipchain__fprintf_graph(fp, &rem_node, &rem_hits, depth,
 					      new_depth_mask, 0, total_samples,
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index 0a97d77509bd..7f0a89584f1b 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -83,6 +83,23 @@ static int parse_callchain_sort_key(const char *value)
 	return -1;
 }
 
+static int parse_callchain_value(const char *value)
+{
+	if (!strncmp(value, "percent", strlen(value))) {
+		callchain_param.value = CCVAL_PERCENT;
+		return 0;
+	}
+	if (!strncmp(value, "period", strlen(value))) {
+		callchain_param.value = CCVAL_PERIOD;
+		return 0;
+	}
+	if (!strncmp(value, "count", strlen(value))) {
+		callchain_param.value = CCVAL_COUNT;
+		return 0;
+	}
+	return -1;
+}
+
 static int
 __parse_callchain_report_opt(const char *arg, bool allow_record_opt)
 {
@@ -106,7 +123,8 @@ __parse_callchain_report_opt(const char *arg, bool allow_record_opt)
 
 		if (!parse_callchain_mode(tok) ||
 		    !parse_callchain_order(tok) ||
-		    !parse_callchain_sort_key(tok)) {
+		    !parse_callchain_sort_key(tok) ||
+		    !parse_callchain_value(tok)) {
 			/* parsing ok - move on to the next */
 			try_stack_size = false;
 			goto next;
@@ -819,12 +837,26 @@ char *callchain_node__sprintf_value(struct callchain_node *node,
 				    char *bf, size_t bfsize, u64 total)
 {
 	double percent = 0.0;
-	u64 cumul = callchain_cumul_hits(node);
+	u64 period = callchain_cumul_hits(node);
+	int count = callchain_cumul_counts(node);
 
 	if (total)
-		percent = cumul * 100.0 / total;
+		percent = period * 100.0 / total;
+	if (callchain_param.mode == CHAIN_FOLDED)
+		count = node->count;
 
-	scnprintf(bf, bfsize, "%6.2f%%", percent);
+	switch (callchain_param.value) {
+	case CCVAL_PERIOD:
+		scnprintf(bf, bfsize, "%"PRIu64, period);
+		break;
+	case CCVAL_COUNT:
+		scnprintf(bf, bfsize, "%u", count);
+		break;
+	case CCVAL_PERCENT:
+	default:
+		scnprintf(bf, bfsize, "%.2f%%", percent);
+		break;
+	}
 	return bf;
 }
 
@@ -832,12 +864,24 @@ int callchain_node__fprintf_value(struct callchain_node *node,
 				 FILE *fp, u64 total)
 {
 	double percent = 0.0;
-	u64 cumul = callchain_cumul_hits(node);
+	u64 period = callchain_cumul_hits(node);
+	int count = callchain_cumul_counts(node);
 
 	if (total)
-		percent = cumul * 100.0 / total;
-
-	return percent_color_fprintf(fp, "%.2f%%", percent);
+		percent = period * 100.0 / total;
+	if (callchain_param.mode == CHAIN_FOLDED)
+		count = node->count;
+
+	switch (callchain_param.value) {
+	case CCVAL_PERIOD:
+		return fprintf(fp, "%"PRIu64, period);
+	case CCVAL_COUNT:
+		return fprintf(fp, "%u", count);
+	case CCVAL_PERCENT:
+	default:
+		return percent_color_fprintf(fp, "%.2f%%", percent);
+	}
+	return 0;
 }
 
 static void free_callchain_node(struct callchain_node *node)
diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h
index 2f948f0ff034..e8533e328a47 100644
--- a/tools/perf/util/callchain.h
+++ b/tools/perf/util/callchain.h
@@ -29,7 +29,8 @@
 	HELP_PAD "print_limit:\tmaximum number of call graph entry (<number>)\n" \
 	HELP_PAD "order:\t\tcall graph order (caller|callee)\n" \
 	HELP_PAD "sort_key:\tcall graph sort key (function|address)\n"	\
-	HELP_PAD "branch:\t\tinclude last branch info to call graph (branch)\n"
+	HELP_PAD "branch:\t\tinclude last branch info to call graph (branch)\n" \
+	HELP_PAD "value:\t\tcall graph value (percent|period|count)\n"
 
 enum perf_call_graph_mode {
 	CALLCHAIN_NONE,
@@ -81,6 +82,12 @@ enum chain_key {
 	CCKEY_ADDRESS
 };
 
+enum chain_value {
+	CCVAL_PERCENT,
+	CCVAL_PERIOD,
+	CCVAL_COUNT,
+};
+
 struct callchain_param {
 	bool			enabled;
 	enum perf_call_graph_mode record_mode;
@@ -93,6 +100,7 @@ struct callchain_param {
 	bool			order_set;
 	enum chain_key		key;
 	bool			branch_callstack;
+	enum chain_value	value;
 };
 
 extern struct callchain_param callchain_param;
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index cd12c25e4ea4..174912f87913 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -20,7 +20,8 @@ struct callchain_param	callchain_param = {
 	.mode	= CHAIN_GRAPH_ABS,
 	.min_percent = 0.5,
 	.order  = ORDER_CALLEE,
-	.key	= CCKEY_FUNCTION
+	.key	= CCKEY_FUNCTION,
+	.value	= CCVAL_PERCENT,
 };
 
 /*
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1261317 — Re: [PATCH v3 4/4] perf report: Add callchain value option

FromJiri Olsa <jolsa@redhat.com>
Date2015-11-03 10:10 +0100
SubjectRe: [PATCH v3 4/4] perf report: Add callchain value option
Message-ID<qqFLk-Gf-7@gated-at.bofh.it>
In reply to#1261254
On Tue, Nov 03, 2015 at 04:18:31PM +0900, Namhyung Kim wrote:

SNIP

> @@ -819,12 +837,26 @@ char *callchain_node__sprintf_value(struct callchain_node *node,
>  				    char *bf, size_t bfsize, u64 total)
>  {
>  	double percent = 0.0;
> -	u64 cumul = callchain_cumul_hits(node);
> +	u64 period = callchain_cumul_hits(node);
> +	int count = callchain_cumul_counts(node);
>  
>  	if (total)
> -		percent = cumul * 100.0 / total;
> +		percent = period * 100.0 / total;
> +	if (callchain_param.mode == CHAIN_FOLDED)
> +		count = node->count;

this could be set/computed below in respective cases

>  
> -	scnprintf(bf, bfsize, "%6.2f%%", percent);
> +	switch (callchain_param.value) {
> +	case CCVAL_PERIOD:
> +		scnprintf(bf, bfsize, "%"PRIu64, period);
> +		break;
> +	case CCVAL_COUNT:
> +		scnprintf(bf, bfsize, "%u", count);
> +		break;
> +	case CCVAL_PERCENT:
> +	default:
> +		scnprintf(bf, bfsize, "%.2f%%", percent);
> +		break;
> +	}
>  	return bf;
>  }
>  
> @@ -832,12 +864,24 @@ int callchain_node__fprintf_value(struct callchain_node *node,
>  				 FILE *fp, u64 total)
>  {
>  	double percent = 0.0;
> -	u64 cumul = callchain_cumul_hits(node);
> +	u64 period = callchain_cumul_hits(node);
> +	int count = callchain_cumul_counts(node);
>  
>  	if (total)
> -		percent = cumul * 100.0 / total;
> -
> -	return percent_color_fprintf(fp, "%.2f%%", percent);
> +		percent = period * 100.0 / total;
> +	if (callchain_param.mode == CHAIN_FOLDED)
> +		count = node->count;
> +

ditto

jirka

> +	switch (callchain_param.value) {
> +	case CCVAL_PERIOD:
> +		return fprintf(fp, "%"PRIu64, period);
> +	case CCVAL_COUNT:
> +		return fprintf(fp, "%u", count);
> +	case CCVAL_PERCENT:
> +	default:
> +		return percent_color_fprintf(fp, "%.2f%%", percent);
> +	}
> +	return 0;
>  }
>  

SNIP
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1261386 — Re: [PATCH v3 4/4] perf report: Add callchain value option

FromNamhyung Kim <namhyung@kernel.org>
Date2015-11-03 12:00 +0100
SubjectRe: [PATCH v3 4/4] perf report: Add callchain value option
Message-ID<qqHtM-1CF-15@gated-at.bofh.it>
In reply to#1261317
On Tue, Nov 03, 2015 at 10:06:27AM +0100, Jiri Olsa wrote:
> On Tue, Nov 03, 2015 at 04:18:31PM +0900, Namhyung Kim wrote:
> 
> SNIP
> 
> > @@ -819,12 +837,26 @@ char *callchain_node__sprintf_value(struct callchain_node *node,
> >  				    char *bf, size_t bfsize, u64 total)
> >  {
> >  	double percent = 0.0;
> > -	u64 cumul = callchain_cumul_hits(node);
> > +	u64 period = callchain_cumul_hits(node);
> > +	int count = callchain_cumul_counts(node);
> >  
> >  	if (total)
> > -		percent = cumul * 100.0 / total;
> > +		percent = period * 100.0 / total;
> > +	if (callchain_param.mode == CHAIN_FOLDED)
> > +		count = node->count;
> 
> this could be set/computed below in respective cases

As you said, I need to check it for node->hit too.  So I ended up
having like following, does it look good to you?

    double percent = 0.0;
    u64 period = callchain_cumul_hits(node);
    unsigned count = callchain_cumul_counts(node);

    if (callchain_param.mode == CHAIN_FOLDED) {
        period = node->hit;
        count = node->count;
    }

    switch (callchain_param.value) {
    case CCVAL_PERIOD:
        scnprintf(bf, bfsize, "%"PRIu64, period);
        break;
    case CCVAL_COUNT:
        scnprintf(bf, bfsize, "%u", count);
        break;
    case CCVAL_PERCENT:
    default:
        if (total)
            percent = period * 100.0 / total;
        scnprintf(bf, bfsize, "%.2f%%", percent);
        break;
    }
    return bf;


Thanks,
Namhyung


> 
> >  
> > -	scnprintf(bf, bfsize, "%6.2f%%", percent);
> > +	switch (callchain_param.value) {
> > +	case CCVAL_PERIOD:
> > +		scnprintf(bf, bfsize, "%"PRIu64, period);
> > +		break;
> > +	case CCVAL_COUNT:
> > +		scnprintf(bf, bfsize, "%u", count);
> > +		break;
> > +	case CCVAL_PERCENT:
> > +	default:
> > +		scnprintf(bf, bfsize, "%.2f%%", percent);
> > +		break;
> > +	}
> >  	return bf;
> >  }
> >  
> > @@ -832,12 +864,24 @@ int callchain_node__fprintf_value(struct callchain_node *node,
> >  				 FILE *fp, u64 total)
> >  {
> >  	double percent = 0.0;
> > -	u64 cumul = callchain_cumul_hits(node);
> > +	u64 period = callchain_cumul_hits(node);
> > +	int count = callchain_cumul_counts(node);
> >  
> >  	if (total)
> > -		percent = cumul * 100.0 / total;
> > -
> > -	return percent_color_fprintf(fp, "%.2f%%", percent);
> > +		percent = period * 100.0 / total;
> > +	if (callchain_param.mode == CHAIN_FOLDED)
> > +		count = node->count;
> > +
> 
> ditto
> 
> jirka
> 
> > +	switch (callchain_param.value) {
> > +	case CCVAL_PERIOD:
> > +		return fprintf(fp, "%"PRIu64, period);
> > +	case CCVAL_COUNT:
> > +		return fprintf(fp, "%u", count);
> > +	case CCVAL_PERCENT:
> > +	default:
> > +		return percent_color_fprintf(fp, "%.2f%%", percent);
> > +	}
> > +	return 0;
> >  }
> >  
> 
> SNIP
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1261409 — Re: [PATCH v3 4/4] perf report: Add callchain value option

FromJiri Olsa <jolsa@redhat.com>
Date2015-11-03 12:20 +0100
SubjectRe: [PATCH v3 4/4] perf report: Add callchain value option
Message-ID<qqHN8-1ZB-21@gated-at.bofh.it>
In reply to#1261386
On Tue, Nov 03, 2015 at 07:53:51PM +0900, Namhyung Kim wrote:
> On Tue, Nov 03, 2015 at 10:06:27AM +0100, Jiri Olsa wrote:
> > On Tue, Nov 03, 2015 at 04:18:31PM +0900, Namhyung Kim wrote:
> > 
> > SNIP
> > 
> > > @@ -819,12 +837,26 @@ char *callchain_node__sprintf_value(struct callchain_node *node,
> > >  				    char *bf, size_t bfsize, u64 total)
> > >  {
> > >  	double percent = 0.0;
> > > -	u64 cumul = callchain_cumul_hits(node);
> > > +	u64 period = callchain_cumul_hits(node);
> > > +	int count = callchain_cumul_counts(node);
> > >  
> > >  	if (total)
> > > -		percent = cumul * 100.0 / total;
> > > +		percent = period * 100.0 / total;
> > > +	if (callchain_param.mode == CHAIN_FOLDED)
> > > +		count = node->count;
> > 
> > this could be set/computed below in respective cases
> 
> As you said, I need to check it for node->hit too.  So I ended up
> having like following, does it look good to you?
> 
>     double percent = 0.0;
>     u64 period = callchain_cumul_hits(node);
>     unsigned count = callchain_cumul_counts(node);
> 
>     if (callchain_param.mode == CHAIN_FOLDED) {
>         period = node->hit;
>         count = node->count;
>     }
> 
>     switch (callchain_param.value) {
>     case CCVAL_PERIOD:
>         scnprintf(bf, bfsize, "%"PRIu64, period);
>         break;
>     case CCVAL_COUNT:
>         scnprintf(bf, bfsize, "%u", count);
>         break;
>     case CCVAL_PERCENT:
>     default:
>         if (total)
>             percent = period * 100.0 / total;
>         scnprintf(bf, bfsize, "%.2f%%", percent);
>         break;
>     }
>     return bf;

seems ok, thanks

jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1261322 — Re: [PATCH v3 4/4] perf report: Add callchain value option

FromJiri Olsa <jolsa@redhat.com>
Date2015-11-03 10:10 +0100
SubjectRe: [PATCH v3 4/4] perf report: Add callchain value option
Message-ID<qqFLm-Gf-37@gated-at.bofh.it>
In reply to#1261254
On Tue, Nov 03, 2015 at 04:18:31PM +0900, Namhyung Kim wrote:
> Now -g/--call-graph option supports how to display callchain values.
> Possible values are 'percent', 'period' and 'count'.  The percent is
> same as before and it's the default behavior.  The period displays the
> raw period value rather than the percentage.  The count displays the
> number of occurrences.
> 
>   $ perf report --no-children --stdio -g percent
>   ...
>     39.93%  swapper  [kernel.vmlinux]  [k] intel_idel
>             |
>             ---intel_idle
>                cpuidle_enter_state
>                cpuidle_enter
>                call_cpuidle
>                cpu_startup_entry
>                |
>                |--28.63%-- start_secondary
>                |
>                 --11.30%-- rest_init
> 
>   $ perf report --no-children --show-total-period --stdio -g period
>   ...
>     39.93%   13018705  swapper  [kernel.vmlinux]  [k] intel_idel
>             |
>             ---intel_idle
>                cpuidle_enter_state
>                cpuidle_enter
>                call_cpuidle
>                cpu_startup_entry
>                |
>                |--9334403-- start_secondary
>                |
>                 --3684302-- rest_init
> 
>   $ perf report --no-children --show-nr-samples --stdio -g count
>   ...
>     39.93%     80  swapper  [kernel.vmlinux]  [k] intel_idel
>             |
>             ---intel_idle
>                cpuidle_enter_state
>                cpuidle_enter
>                call_cpuidle
>                cpu_startup_entry
>                |
>                |--57-- start_secondary
>                |
>                 --23-- rest_init
> 
> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/Documentation/perf-report.txt | 13 ++++---
>  tools/perf/builtin-report.c              |  4 +--
>  tools/perf/ui/stdio/hist.c               | 10 +++++-
>  tools/perf/util/callchain.c              | 60 +++++++++++++++++++++++++++-----
>  tools/perf/util/callchain.h              | 10 +++++-
>  tools/perf/util/util.c                   |  3 +-
>  6 files changed, 83 insertions(+), 17 deletions(-)
> 
> diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
> index 5ce8da1e1256..bb9fd23a105e 100644
> --- a/tools/perf/Documentation/perf-report.txt
> +++ b/tools/perf/Documentation/perf-report.txt
> @@ -170,11 +170,11 @@ OPTIONS
>          Dump raw trace in ASCII.
>  
>  -g::
> ---call-graph=<print_type,threshold[,print_limit],order,sort_key,branch>::
> +--call-graph=<print_type,threshold[,print_limit],order,sort_key[,branch],value>::
>          Display call chains using type, min percent threshold, print limit,
> -	call order, sort key and branch.  Note that ordering of parameters is not
> -	fixed so any parement can be given in an arbitraty order.  One exception
> -	is the print_limit which should be preceded by threshold.
> +	call order, sort key, optional branch and value.  Note that ordering of
> +	parameters is not fixed so any parement can be given in an arbitraty order.
> +	One exception is the print_limit which should be preceded by threshold.
>  
>  	print_type can be either:
>  	- flat: single column, linear exposure of call chains.
> @@ -204,6 +204,11 @@ OPTIONS
>  	- branch: include last branch information in callgraph when available.
>  	          Usually more convenient to use --branch-history for this.
>  
> +	value can be:
> +	- percent: diplay overhead percent (default)
> +	- period: display event period
> +	- count: display evnt count

s/evnt/event/            ^^^^

jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web