All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback
@ 2019-03-15 21:16 Jin Yao
  2019-03-20  0:35 ` Jin, Yao
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Jin Yao @ 2019-03-15 21:16 UTC (permalink / raw)
  To: acme, jolsa, peterz, mingo, alexander.shishkin
  Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao

The hist__account_cycles is executed when the hist_iter__branch_callback
is called. But it looks it's not necessary. In hist__account_cycles, it
already walks on all branch entries.

This patch moves the hist__account_cycles out of callback, now the data
processing is much faster than before.

Previous code has an issue that the ch[offset].num++
(in __symbol__account_cycles) is executed repeatedly since
hist__account_cycles is called in each hist_iter__branch_callback,
so the counting of ch[offset].num is not correct (too big).
With this patch, the issue is fixed. And we don't need the code of
"ch->reset >= ch->num / 2" to check if there are too many overlaps
(in annotation__count_and_fill), otherwise some data would be
hidden.

Now, we can try, for example:

perf record -b ...
perf annotate or perf report -s symbol

The before/after output should be no change.

 v3:
 ---
 Fix the crash in stdio mode.
 Like previous code, it needs the checking of ui__has_annotation()
 before hist__account_cycles()

 v2:
 ---
 1. Cover the similar perf report
 2. Remove the checking code "ch->reset >= ch->num / 2"

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
 tools/perf/builtin-annotate.c |  4 ++--
 tools/perf/builtin-report.c   | 11 +++++------
 tools/perf/util/annotate.c    |  2 +-
 3 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 67f9d9f..77deb3a 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -159,8 +159,6 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
 	struct perf_evsel *evsel = iter->evsel;
 	int err;
 
-	hist__account_cycles(sample->branch_stack, al, sample, false);
-
 	bi = he->branch_info;
 	err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
 
@@ -199,6 +197,8 @@ static int process_branch_callback(struct perf_evsel *evsel,
 	if (a.map != NULL)
 		a.map->dso->hit = 1;
 
+	hist__account_cycles(sample->branch_stack, al, sample, false);
+
 	ret = hist_entry_iter__add(&iter, &a, PERF_MAX_STACK_DEPTH, ann);
 	return ret;
 }
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 1921aaa..493e115 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -136,9 +136,6 @@ static int hist_iter__report_callback(struct hist_entry_iter *iter,
 	if (!ui__has_annotation() && !rep->symbol_ipc)
 		return 0;
 
-	hist__account_cycles(sample->branch_stack, al, sample,
-			     rep->nonany_branch_mode);
-
 	if (sort__mode == SORT_MODE__BRANCH) {
 		bi = he->branch_info;
 		err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
@@ -181,9 +178,6 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
 	if (!ui__has_annotation() && !rep->symbol_ipc)
 		return 0;
 
-	hist__account_cycles(sample->branch_stack, al, sample,
-			     rep->nonany_branch_mode);
-
 	bi = he->branch_info;
 	err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
 	if (err)
@@ -282,6 +276,11 @@ static int process_sample_event(struct perf_tool *tool,
 	if (al.map != NULL)
 		al.map->dso->hit = 1;
 
+	if (ui__has_annotation() || rep->symbol_ipc) {
+		hist__account_cycles(sample->branch_stack, &al, sample,
+				     rep->nonany_branch_mode);
+	}
+
 	ret = hist_entry_iter__add(&iter, &al, rep->max_stack, rep);
 	if (ret < 0)
 		pr_debug("problem adding hist entry, skipping event\n");
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 5f6dbbf..e8080c0 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1015,7 +1015,7 @@ static void annotation__count_and_fill(struct annotation *notes, u64 start, u64
 		float ipc = n_insn / ((double)ch->cycles / (double)ch->num);
 
 		/* Hide data when there are too many overlaps. */
-		if (ch->reset >= 0x7fff || ch->reset >= ch->num / 2)
+		if (ch->reset >= 0x7fff)
 			return;
 
 		for (offset = start; offset <= end; offset++) {
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback
  2019-03-15 21:16 [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback Jin Yao
@ 2019-03-20  0:35 ` Jin, Yao
  2019-03-20  1:47   ` Andi Kleen
  2019-04-10 13:00 ` Arnaldo Carvalho de Melo
  2019-05-18  8:46 ` [tip:perf/core] perf annotate: Remove hist__account_cycles() " tip-bot for Jin Yao
  2 siblings, 1 reply; 5+ messages in thread
From: Jin, Yao @ 2019-03-20  0:35 UTC (permalink / raw)
  To: acme, jolsa, peterz, mingo, alexander.shishkin
  Cc: Linux-kernel, ak, kan.liang, yao.jin

Nobody like this patch? :)

In my test, for a 72MB perf.data (with LBR data), the perf annotate 
processing speed:

Before: 10.2s
After: 2.2s

Thanks
Jin Yao

On 3/16/2019 5:16 AM, Jin Yao wrote:
> The hist__account_cycles is executed when the hist_iter__branch_callback
> is called. But it looks it's not necessary. In hist__account_cycles, it
> already walks on all branch entries.
> 
> This patch moves the hist__account_cycles out of callback, now the data
> processing is much faster than before.
> 
> Previous code has an issue that the ch[offset].num++
> (in __symbol__account_cycles) is executed repeatedly since
> hist__account_cycles is called in each hist_iter__branch_callback,
> so the counting of ch[offset].num is not correct (too big).
> With this patch, the issue is fixed. And we don't need the code of
> "ch->reset >= ch->num / 2" to check if there are too many overlaps
> (in annotation__count_and_fill), otherwise some data would be
> hidden.
> 
> Now, we can try, for example:
> 
> perf record -b ...
> perf annotate or perf report -s symbol
> 
> The before/after output should be no change.
> 
>   v3:
>   ---
>   Fix the crash in stdio mode.
>   Like previous code, it needs the checking of ui__has_annotation()
>   before hist__account_cycles()
> 
>   v2:
>   ---
>   1. Cover the similar perf report
>   2. Remove the checking code "ch->reset >= ch->num / 2"
> 
> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
> ---
>   tools/perf/builtin-annotate.c |  4 ++--
>   tools/perf/builtin-report.c   | 11 +++++------
>   tools/perf/util/annotate.c    |  2 +-
>   3 files changed, 8 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
> index 67f9d9f..77deb3a 100644
> --- a/tools/perf/builtin-annotate.c
> +++ b/tools/perf/builtin-annotate.c
> @@ -159,8 +159,6 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
>   	struct perf_evsel *evsel = iter->evsel;
>   	int err;
>   
> -	hist__account_cycles(sample->branch_stack, al, sample, false);
> -
>   	bi = he->branch_info;
>   	err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
>   
> @@ -199,6 +197,8 @@ static int process_branch_callback(struct perf_evsel *evsel,
>   	if (a.map != NULL)
>   		a.map->dso->hit = 1;
>   
> +	hist__account_cycles(sample->branch_stack, al, sample, false);
> +
>   	ret = hist_entry_iter__add(&iter, &a, PERF_MAX_STACK_DEPTH, ann);
>   	return ret;
>   }
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index 1921aaa..493e115 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -136,9 +136,6 @@ static int hist_iter__report_callback(struct hist_entry_iter *iter,
>   	if (!ui__has_annotation() && !rep->symbol_ipc)
>   		return 0;
>   
> -	hist__account_cycles(sample->branch_stack, al, sample,
> -			     rep->nonany_branch_mode);
> -
>   	if (sort__mode == SORT_MODE__BRANCH) {
>   		bi = he->branch_info;
>   		err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
> @@ -181,9 +178,6 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
>   	if (!ui__has_annotation() && !rep->symbol_ipc)
>   		return 0;
>   
> -	hist__account_cycles(sample->branch_stack, al, sample,
> -			     rep->nonany_branch_mode);
> -
>   	bi = he->branch_info;
>   	err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
>   	if (err)
> @@ -282,6 +276,11 @@ static int process_sample_event(struct perf_tool *tool,
>   	if (al.map != NULL)
>   		al.map->dso->hit = 1;
>   
> +	if (ui__has_annotation() || rep->symbol_ipc) {
> +		hist__account_cycles(sample->branch_stack, &al, sample,
> +				     rep->nonany_branch_mode);
> +	}
> +
>   	ret = hist_entry_iter__add(&iter, &al, rep->max_stack, rep);
>   	if (ret < 0)
>   		pr_debug("problem adding hist entry, skipping event\n");
> diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
> index 5f6dbbf..e8080c0 100644
> --- a/tools/perf/util/annotate.c
> +++ b/tools/perf/util/annotate.c
> @@ -1015,7 +1015,7 @@ static void annotation__count_and_fill(struct annotation *notes, u64 start, u64
>   		float ipc = n_insn / ((double)ch->cycles / (double)ch->num);
>   
>   		/* Hide data when there are too many overlaps. */
> -		if (ch->reset >= 0x7fff || ch->reset >= ch->num / 2)
> +		if (ch->reset >= 0x7fff)
>   			return;
>   
>   		for (offset = start; offset <= end; offset++) {
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback
  2019-03-20  0:35 ` Jin, Yao
@ 2019-03-20  1:47   ` Andi Kleen
  0 siblings, 0 replies; 5+ messages in thread
From: Andi Kleen @ 2019-03-20  1:47 UTC (permalink / raw)
  To: Jin, Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel,
	kan.liang, yao.jin

On Wed, Mar 20, 2019 at 08:35:17AM +0800, Jin, Yao wrote:
> Nobody like this patch? :)
> 
> In my test, for a 72MB perf.data (with LBR data), the perf annotate
> processing speed:
> 
> Before: 10.2s
> After: 2.2s

That's great!

-Andi

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback
  2019-03-15 21:16 [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback Jin Yao
  2019-03-20  0:35 ` Jin, Yao
@ 2019-04-10 13:00 ` Arnaldo Carvalho de Melo
  2019-05-18  8:46 ` [tip:perf/core] perf annotate: Remove hist__account_cycles() " tip-bot for Jin Yao
  2 siblings, 0 replies; 5+ messages in thread
From: Arnaldo Carvalho de Melo @ 2019-04-10 13:00 UTC (permalink / raw)
  To: Jin Yao
  Cc: jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin

Em Sat, Mar 16, 2019 at 05:16:17AM +0800, Jin Yao escreveu:
> The hist__account_cycles is executed when the hist_iter__branch_callback
> is called. But it looks it's not necessary. In hist__account_cycles, it
> already walks on all branch entries.
> 
> This patch moves the hist__account_cycles out of callback, now the data
> processing is much faster than before.
> 
> Previous code has an issue that the ch[offset].num++
> (in __symbol__account_cycles) is executed repeatedly since
> hist__account_cycles is called in each hist_iter__branch_callback,
> so the counting of ch[offset].num is not correct (too big).
> With this patch, the issue is fixed. And we don't need the code of
> "ch->reset >= ch->num / 2" to check if there are too many overlaps
> (in annotation__count_and_fill), otherwise some data would be
> hidden.
> 
> Now, we can try, for example:

Tested with:

  perf annotate --stdio
  perf annotate --stdio2
  perf annotate --tui
  perf report --tui -> press annotation hotkey 'a'

Applied,

- Arnaldo

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [tip:perf/core] perf annotate: Remove hist__account_cycles() from callback
  2019-03-15 21:16 [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback Jin Yao
  2019-03-20  0:35 ` Jin, Yao
  2019-04-10 13:00 ` Arnaldo Carvalho de Melo
@ 2019-05-18  8:46 ` tip-bot for Jin Yao
  2 siblings, 0 replies; 5+ messages in thread
From: tip-bot for Jin Yao @ 2019-05-18  8:46 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, ak, peterz, kan.liang, yao.jin, linux-kernel, hpa, jolsa,
	yao.jin, alexander.shishkin, mingo, tglx

Commit-ID:  bdd1666b3d03d675bdb7f8d92b29f2797acbc5e8
Gitweb:     https://git.kernel.org/tip/bdd1666b3d03d675bdb7f8d92b29f2797acbc5e8
Author:     Jin Yao <yao.jin@linux.intel.com>
AuthorDate: Sat, 16 Mar 2019 05:16:17 +0800
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 15 May 2019 16:36:46 -0300

perf annotate: Remove hist__account_cycles() from callback

The hist__account_cycles() function is executed when the
hist_iter__branch_callback() is called.

But it looks it's not necessary.  In hist__account_cycles, it already
walks on all branch entries.

This patch moves the hist__account_cycles out of callback, now the data
processing is much faster than before.

Previous code has an issue that the ch[offset].num++ (in
__symbol__account_cycles) is executed repeatedly since
hist__account_cycles is called in each hist_iter__branch_callback, so
the counting of ch[offset].num is not correct (too big).

With this patch, the issue is fixed. And we don't need the code of
"ch->reset >= ch->num / 2" to check if there are too many overlaps (in
annotation__count_and_fill), otherwise some data would be hidden.

Now, we can try, for example:

  perf record -b ...
  perf annotate or perf report -s symbol

The before/after output should be no change.

 v3:
 ---
 Fix the crash in stdio mode.
 Like previous code, it needs the checking of ui__has_annotation()
 before hist__account_cycles()

 v2:
 ---
 1. Cover the similar perf report
 2. Remove the checking code "ch->reset >= ch->num / 2"

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1552684577-29041-1-git-send-email-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-annotate.c |  4 ++--
 tools/perf/builtin-report.c   | 11 +++++------
 tools/perf/util/annotate.c    |  2 +-
 3 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 67f9d9ffacfb..77deb3a40596 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -159,8 +159,6 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
 	struct perf_evsel *evsel = iter->evsel;
 	int err;
 
-	hist__account_cycles(sample->branch_stack, al, sample, false);
-
 	bi = he->branch_info;
 	err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
 
@@ -199,6 +197,8 @@ static int process_branch_callback(struct perf_evsel *evsel,
 	if (a.map != NULL)
 		a.map->dso->hit = 1;
 
+	hist__account_cycles(sample->branch_stack, al, sample, false);
+
 	ret = hist_entry_iter__add(&iter, &a, PERF_MAX_STACK_DEPTH, ann);
 	return ret;
 }
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 4054eb1f98ac..91e27ac297c2 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -136,9 +136,6 @@ static int hist_iter__report_callback(struct hist_entry_iter *iter,
 	if (!ui__has_annotation() && !rep->symbol_ipc)
 		return 0;
 
-	hist__account_cycles(sample->branch_stack, al, sample,
-			     rep->nonany_branch_mode);
-
 	if (sort__mode == SORT_MODE__BRANCH) {
 		bi = he->branch_info;
 		err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
@@ -181,9 +178,6 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
 	if (!ui__has_annotation() && !rep->symbol_ipc)
 		return 0;
 
-	hist__account_cycles(sample->branch_stack, al, sample,
-			     rep->nonany_branch_mode);
-
 	bi = he->branch_info;
 	err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
 	if (err)
@@ -282,6 +276,11 @@ static int process_sample_event(struct perf_tool *tool,
 	if (al.map != NULL)
 		al.map->dso->hit = 1;
 
+	if (ui__has_annotation() || rep->symbol_ipc) {
+		hist__account_cycles(sample->branch_stack, &al, sample,
+				     rep->nonany_branch_mode);
+	}
+
 	ret = hist_entry_iter__add(&iter, &al, rep->max_stack, rep);
 	if (ret < 0)
 		pr_debug("problem adding hist entry, skipping event\n");
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 09762985c713..0b8573fd9b05 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1021,7 +1021,7 @@ static void annotation__count_and_fill(struct annotation *notes, u64 start, u64
 		float ipc = n_insn / ((double)ch->cycles / (double)ch->num);
 
 		/* Hide data when there are too many overlaps. */
-		if (ch->reset >= 0x7fff || ch->reset >= ch->num / 2)
+		if (ch->reset >= 0x7fff)
 			return;
 
 		for (offset = start; offset <= end; offset++) {

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-05-18  8:46 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-15 21:16 [PATCH v3] perf annotate/report: Remove hist__account_cycles from callback Jin Yao
2019-03-20  0:35 ` Jin, Yao
2019-03-20  1:47   ` Andi Kleen
2019-04-10 13:00 ` Arnaldo Carvalho de Melo
2019-05-18  8:46 ` [tip:perf/core] perf annotate: Remove hist__account_cycles() " tip-bot for Jin Yao

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.