Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1344211 > unrolled thread
| Started by | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| First post | 2016-02-26 13:20 +0100 |
| Last post | 2016-02-27 10:50 +0100 |
| Articles | 5 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH 1/5] perf hists: Add more helper functions for the hierarchy mode Namhyung Kim <namhyung@kernel.org> - 2016-02-26 13:20 +0100
[PATCH 2/5] perf report: Show message for percent limit on stdio Namhyung Kim <namhyung@kernel.org> - 2016-02-26 13:20 +0100
Re: [PATCH 2/5] perf report: Show message for percent limit on stdio Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-02-26 15:20 +0100
[tip:perf/core] perf report: Show message for percent limit on stdio tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-02-27 10:50 +0100
[tip:perf/core] perf hists: Add more helper functions for the hierarchy mode tip-bot for Namhyung Kim <tipbot@zytor.com> - 2016-02-27 10:50 +0100
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2016-02-26 13:20 +0100 |
| Subject | [PATCH 1/5] perf hists: Add more helper functions for the hierarchy mode |
| Message-ID | <r6pxg-331-3@gated-at.bofh.it> |
The hists__overhead_width() is to calculate width occupied by the
overhead (and others) columns before the sort columns.
The hist_entry__has_hiearchy_children() is to check whether an entry has
lower entries (children) in the hierarchy to be shown in the output.
This means the children should not be filtered out and above the percent
limit.
These two functions will be used to show information when all children
of an entry is omitted by the percent limit (or filter).
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/ui/hist.c | 22 ++++++++++++++++++++++
tools/perf/util/hist.c | 25 +++++++++++++++++++++++++
tools/perf/util/hist.h | 3 +++
3 files changed, 50 insertions(+)
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index edbf854e8e1c..7c0585c146e1 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -643,6 +643,28 @@ unsigned int hists__sort_list_width(struct hists *hists)
return ret;
}
+unsigned int hists__overhead_width(struct hists *hists)
+{
+ struct perf_hpp_fmt *fmt;
+ int ret = 0;
+ bool first = true;
+ struct perf_hpp dummy_hpp;
+
+ hists__for_each_format(hists, fmt) {
+ if (perf_hpp__is_sort_entry(fmt) || perf_hpp__is_dynamic_entry(fmt))
+ break;
+
+ if (first)
+ first = false;
+ else
+ ret += 2;
+
+ ret += fmt->width(fmt, &dummy_hpp, hists_to_evsel(hists));
+ }
+
+ return ret;
+}
+
void perf_hpp__reset_width(struct perf_hpp_fmt *fmt, struct hists *hists)
{
if (perf_hpp__is_sort_entry(fmt))
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 1c530428e087..e71691977a95 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1582,6 +1582,31 @@ struct rb_node *rb_hierarchy_prev(struct rb_node *node)
return &he->rb_node;
}
+bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit)
+{
+ struct rb_node *node;
+ struct hist_entry *child;
+ float percent;
+
+ if (he->leaf)
+ return false;
+
+ node = rb_first(&he->hroot_out);
+ child = rb_entry(node, struct hist_entry, rb_node);
+
+ while (node && child->filtered) {
+ node = rb_next(node);
+ child = rb_entry(node, struct hist_entry, rb_node);
+ }
+
+ if (node)
+ percent = hist_entry__get_percent_limit(child);
+ else
+ percent = 0;
+
+ return node && percent >= limit;
+}
+
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 722aa447f705..da3e7b6e4615 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -410,6 +410,7 @@ static inline int script_browse(const char *script_opt __maybe_unused)
#endif
unsigned int hists__sort_list_width(struct hists *hists);
+unsigned int hists__overhead_width(struct hists *hists);
void hist__account_cycles(struct branch_stack *bs, struct addr_location *al,
struct perf_sample *sample, bool nonany_branch_mode);
@@ -439,4 +440,6 @@ static inline struct rb_node *rb_hierarchy_next(struct rb_node *node)
#define HIERARCHY_INDENT 3
+bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit);
+
#endif /* __PERF_HIST_H */
--
2.7.1
[toc] | [next] | [standalone]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2016-02-26 13:20 +0100 |
| Subject | [PATCH 2/5] perf report: Show message for percent limit on stdio |
| Message-ID | <r6pxg-331-19@gated-at.bofh.it> |
| In reply to | #1344211 |
When the hierarchy mode is used, some entries might be omiited due to a
percent limit or filter. In this case the output hierarchy is different
than other entries. Add an informative message to users about this.
For example, when 4% of percent limit is applied:
Before:
# Overhead Command / Shared Object / Symbol
# .............. ..........................................
#
49.09% swapper
48.67% [kernel.vmlinux]
34.42% [k] intel_idle
11.51% firefox
8.87% libpthread-2.22.so
6.60% [.] __GI___libc_recvmsg
10.49% gnome-shell
4.74% libc-2.22.so
10.08% Xorg
6.11% libc-2.22.so
5.27% [.] __memcpy_sse2_unaligned
6.15% perf
Note that, gnome-shell/libc has no symbols and perf has no dso/symbols.
With that patch the output will look like below:
After:
# Overhead Command / Shared Object / Symbol
# .............. ..........................................
#
49.09% swapper
48.67% [kernel.vmlinux]
34.42% [k] intel_idle
11.51% firefox
8.87% libpthread-2.22.so
6.60% [.] __GI___libc_recvmsg
10.49% gnome-shell
4.74% libc-2.22.so
no entry >= 4.00%
10.08% Xorg
6.11% libc-2.22.so
5.27% [.] __memcpy_sse2_unaligned
6.15% perf
no entry >= 4.00%
Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/ui/stdio/hist.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index 435eaaaf2f1d..b3bdfcb245f9 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -628,6 +628,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
bool first = true;
size_t linesz;
char *line = NULL;
+ unsigned indent;
init_rem_hits();
@@ -704,6 +705,8 @@ print_entries:
goto out;
}
+ indent = hists__overhead_width(hists) + 4;
+
for (nd = rb_first(&hists->entries); nd; nd = __rb_hierarchy_next(nd, HMD_FORCE_CHILD)) {
struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
float percent;
@@ -720,6 +723,20 @@ print_entries:
if (max_rows && ++nr_rows >= max_rows)
break;
+ /*
+ * If all children are filtered out or percent-limited,
+ * display "no entry >= x.xx%" message.
+ */
+ if (!h->leaf && !hist_entry__has_hierarchy_children(h, min_pcnt)) {
+ int nr_sort = hists->hpp_list->nr_sort_keys;
+
+ print_hierarchy_indent(sep, nr_sort + h->depth + 1, spaces, fp);
+ fprintf(fp, "%*sno entry >= %.2f%%\n", indent, "", min_pcnt);
+
+ if (max_rows && ++nr_rows >= max_rows)
+ break;
+ }
+
if (h->ms.map == NULL && verbose > 1) {
__map_groups__fprintf_maps(h->thread->mg,
MAP__FUNCTION, fp);
--
2.7.1
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2016-02-26 15:20 +0100 |
| Subject | Re: [PATCH 2/5] perf report: Show message for percent limit on stdio |
| Message-ID | <r6rpn-4uI-3@gated-at.bofh.it> |
| In reply to | #1344212 |
Em Fri, Feb 26, 2016 at 09:13:17PM +0900, Namhyung Kim escreveu:
> When the hierarchy mode is used, some entries might be omiited due to a
> percent limit or filter. In this case the output hierarchy is different
> than other entries. Add an informative message to users about this.
>
> For example, when 4% of percent limit is applied:
>
> Before:
> # Overhead Command / Shared Object / Symbol
> # .............. ..........................................
> #
> 49.09% swapper
> 48.67% [kernel.vmlinux]
> 34.42% [k] intel_idle
> 11.51% firefox
> 8.87% libpthread-2.22.so
> 6.60% [.] __GI___libc_recvmsg
> 10.49% gnome-shell
> 4.74% libc-2.22.so
> 10.08% Xorg
> 6.11% libc-2.22.so
> 5.27% [.] __memcpy_sse2_unaligned
> 6.15% perf
That is great, and while testing it another idea came to me, what about
telling how many entries are below the threshold (--percent-limit)?
Something like:
47.60% firefox
44.98% libxul.so
11.01% [.] 0x0000000001187918
10.84% [.] 0x0000000001187a5c
3.10% [.] 0x00000000011875c9
1.62% [.] 0x000000000118792b
1.47% [.] 0x00000000011875d8
1.39% [.] 0x0000000001187a6f
1.31% [.] 0x0000000001187a4a
1.27% [.] 0x0000000001187906
1.45% perf-9205.map
no entry >= 1.00%
33.40% swapper
33.35% [kernel.vmlinux]
30.50% [k] intel_idle
25 entries < 1%
14.86% qemu-system-x86
7.58% [kvm]
2.40% [k] kvm_arch_vcpu_runnable
1.03% [k] kvm_vcpu_check_block
1 entry < 1%
Another: pressing enter over these 'no entry >= M%' and 'N entries < M%'
would show those entries, for that specific point.
One more: Make '1.00%' appear as '1%' no need for .00, it adds no
information and takes precious screen space.
Thanks! Applying this patch and looking at the others in this patchkit,
- Arnaldo
> Note that, gnome-shell/libc has no symbols and perf has no dso/symbols.
> With that patch the output will look like below:
>
> After:
>
> # Overhead Command / Shared Object / Symbol
> # .............. ..........................................
> #
> 49.09% swapper
> 48.67% [kernel.vmlinux]
> 34.42% [k] intel_idle
> 11.51% firefox
> 8.87% libpthread-2.22.so
> 6.60% [.] __GI___libc_recvmsg
> 10.49% gnome-shell
> 4.74% libc-2.22.so
> no entry >= 4.00%
> 10.08% Xorg
> 6.11% libc-2.22.so
> 5.27% [.] __memcpy_sse2_unaligned
> 6.15% perf
> no entry >= 4.00%
>
> Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> tools/perf/ui/stdio/hist.c | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
> index 435eaaaf2f1d..b3bdfcb245f9 100644
> --- a/tools/perf/ui/stdio/hist.c
> +++ b/tools/perf/ui/stdio/hist.c
> @@ -628,6 +628,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
> bool first = true;
> size_t linesz;
> char *line = NULL;
> + unsigned indent;
>
> init_rem_hits();
>
> @@ -704,6 +705,8 @@ print_entries:
> goto out;
> }
>
> + indent = hists__overhead_width(hists) + 4;
> +
> for (nd = rb_first(&hists->entries); nd; nd = __rb_hierarchy_next(nd, HMD_FORCE_CHILD)) {
> struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
> float percent;
> @@ -720,6 +723,20 @@ print_entries:
> if (max_rows && ++nr_rows >= max_rows)
> break;
>
> + /*
> + * If all children are filtered out or percent-limited,
> + * display "no entry >= x.xx%" message.
> + */
> + if (!h->leaf && !hist_entry__has_hierarchy_children(h, min_pcnt)) {
> + int nr_sort = hists->hpp_list->nr_sort_keys;
> +
> + print_hierarchy_indent(sep, nr_sort + h->depth + 1, spaces, fp);
> + fprintf(fp, "%*sno entry >= %.2f%%\n", indent, "", min_pcnt);
> +
> + if (max_rows && ++nr_rows >= max_rows)
> + break;
> + }
> +
> if (h->ms.map == NULL && verbose > 1) {
> __map_groups__fprintf_maps(h->thread->mg,
> MAP__FUNCTION, fp);
> --
> 2.7.1
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Namhyung Kim <tipbot@zytor.com> |
|---|---|
| Date | 2016-02-27 10:50 +0100 |
| Subject | [tip:perf/core] perf report: Show message for percent limit on stdio |
| Message-ID | <r6JFF-XE-31@gated-at.bofh.it> |
| In reply to | #1344212 |
Commit-ID: bd4abd39db92225dde8335c37d6f4efb319f9cf2
Gitweb: http://git.kernel.org/tip/bd4abd39db92225dde8335c37d6f4efb319f9cf2
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Fri, 26 Feb 2016 21:13:17 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Fri, 26 Feb 2016 11:20:36 -0300
perf report: Show message for percent limit on stdio
When the hierarchy mode is used, some entries might be omiited due to a
percent limit or filter. In this case the output hierarchy is different
than other entries. Add an informative message to users about this.
For example, when 4% of percent limit is applied:
Before:
# Overhead Command / Shared Object / Symbol
# .............. ..........................................
#
49.09% swapper
48.67% [kernel.vmlinux]
34.42% [k] intel_idle
11.51% firefox
8.87% libpthread-2.22.so
6.60% [.] __GI___libc_recvmsg
10.49% gnome-shell
4.74% libc-2.22.so
10.08% Xorg
6.11% libc-2.22.so
5.27% [.] __memcpy_sse2_unaligned
6.15% perf
Note that, gnome-shell/libc has no symbols and perf has no dso/symbols.
With that patch the output will look like below:
After:
# Overhead Command / Shared Object / Symbol
# .............. ..........................................
#
49.09% swapper
48.67% [kernel.vmlinux]
34.42% [k] intel_idle
11.51% firefox
8.87% libpthread-2.22.so
6.60% [.] __GI___libc_recvmsg
10.49% gnome-shell
4.74% libc-2.22.so
no entry >= 4.00%
10.08% Xorg
6.11% libc-2.22.so
5.27% [.] __memcpy_sse2_unaligned
6.15% perf
no entry >= 4.00%
Suggested-and-Tested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Namhyung Kim <namhyung@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/1456488800-28124-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/stdio/hist.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index 435eaaa..b3bdfcb 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -628,6 +628,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
bool first = true;
size_t linesz;
char *line = NULL;
+ unsigned indent;
init_rem_hits();
@@ -704,6 +705,8 @@ print_entries:
goto out;
}
+ indent = hists__overhead_width(hists) + 4;
+
for (nd = rb_first(&hists->entries); nd; nd = __rb_hierarchy_next(nd, HMD_FORCE_CHILD)) {
struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
float percent;
@@ -720,6 +723,20 @@ print_entries:
if (max_rows && ++nr_rows >= max_rows)
break;
+ /*
+ * If all children are filtered out or percent-limited,
+ * display "no entry >= x.xx%" message.
+ */
+ if (!h->leaf && !hist_entry__has_hierarchy_children(h, min_pcnt)) {
+ int nr_sort = hists->hpp_list->nr_sort_keys;
+
+ print_hierarchy_indent(sep, nr_sort + h->depth + 1, spaces, fp);
+ fprintf(fp, "%*sno entry >= %.2f%%\n", indent, "", min_pcnt);
+
+ if (max_rows && ++nr_rows >= max_rows)
+ break;
+ }
+
if (h->ms.map == NULL && verbose > 1) {
__map_groups__fprintf_maps(h->thread->mg,
MAP__FUNCTION, fp);
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Namhyung Kim <tipbot@zytor.com> |
|---|---|
| Date | 2016-02-27 10:50 +0100 |
| Subject | [tip:perf/core] perf hists: Add more helper functions for the hierarchy mode |
| Message-ID | <r6JFF-XE-33@gated-at.bofh.it> |
| In reply to | #1344211 |
Commit-ID: a7b5895b91fb97f2b0dcc2e3ce47413c18d19ca5
Gitweb: http://git.kernel.org/tip/a7b5895b91fb97f2b0dcc2e3ce47413c18d19ca5
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Fri, 26 Feb 2016 21:13:16 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Fri, 26 Feb 2016 11:20:35 -0300
perf hists: Add more helper functions for the hierarchy mode
The hists__overhead_width() is to calculate width occupied by the
overhead (and others) columns before the sort columns.
The hist_entry__has_hiearchy_children() is to check whether an entry has
lower entries (children) in the hierarchy to be shown in the output.
This means the children should not be filtered out and above the percent
limit.
These two functions will be used to show information when all children
of an entry is omitted by the percent limit (or filter).
Signed-off-by: Namhyung Kim <namhyung@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/1456488800-28124-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/ui/hist.c | 22 ++++++++++++++++++++++
tools/perf/util/hist.c | 25 +++++++++++++++++++++++++
tools/perf/util/hist.h | 3 +++
3 files changed, 50 insertions(+)
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index edbf854..7c0585c 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -643,6 +643,28 @@ unsigned int hists__sort_list_width(struct hists *hists)
return ret;
}
+unsigned int hists__overhead_width(struct hists *hists)
+{
+ struct perf_hpp_fmt *fmt;
+ int ret = 0;
+ bool first = true;
+ struct perf_hpp dummy_hpp;
+
+ hists__for_each_format(hists, fmt) {
+ if (perf_hpp__is_sort_entry(fmt) || perf_hpp__is_dynamic_entry(fmt))
+ break;
+
+ if (first)
+ first = false;
+ else
+ ret += 2;
+
+ ret += fmt->width(fmt, &dummy_hpp, hists_to_evsel(hists));
+ }
+
+ return ret;
+}
+
void perf_hpp__reset_width(struct perf_hpp_fmt *fmt, struct hists *hists)
{
if (perf_hpp__is_sort_entry(fmt))
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 1c53042..e716919 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1582,6 +1582,31 @@ struct rb_node *rb_hierarchy_prev(struct rb_node *node)
return &he->rb_node;
}
+bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit)
+{
+ struct rb_node *node;
+ struct hist_entry *child;
+ float percent;
+
+ if (he->leaf)
+ return false;
+
+ node = rb_first(&he->hroot_out);
+ child = rb_entry(node, struct hist_entry, rb_node);
+
+ while (node && child->filtered) {
+ node = rb_next(node);
+ child = rb_entry(node, struct hist_entry, rb_node);
+ }
+
+ if (node)
+ percent = hist_entry__get_percent_limit(child);
+ else
+ percent = 0;
+
+ return node && percent >= limit;
+}
+
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 722aa44..da3e7b6 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -410,6 +410,7 @@ static inline int script_browse(const char *script_opt __maybe_unused)
#endif
unsigned int hists__sort_list_width(struct hists *hists);
+unsigned int hists__overhead_width(struct hists *hists);
void hist__account_cycles(struct branch_stack *bs, struct addr_location *al,
struct perf_sample *sample, bool nonany_branch_mode);
@@ -439,4 +440,6 @@ static inline struct rb_node *rb_hierarchy_next(struct rb_node *node)
#define HIERARCHY_INDENT 3
+bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit);
+
#endif /* __PERF_HIST_H */
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web