[PATCH 00/19] perf report: Add support for event group view (v9)

Namhyung Kim
2013-01-22T09:10:27Z

Hello,

This is a 9th attempt to enable event group view support to perf report.

The basic idea is link group member's hist entries to a leader so that
they can be shown with leader's output together. The output is sorted
by the leader's period and in turn first group member's and so on.

To use it, 'perf record' should group events when recording. And then
perf report parses the saved group relation from file header and
prints them together if --group option is provided. You can use 'perf
evlist' command to see event group information:

$ perf record -e '{ref-cycles,cycles}' noploop 1
[ perf record: Woken up 2 times to write data ]
[ perf record: Captured and wrote 0.385 MB perf.data (~16807 samples) ]

$ perf evlist --group
{ref-cycles,cycles}

With this example, default perf report will show you each event
separately like this:

$ perf report
...
# group: {ref-cycles,cycles}
# ========
#
# Samples: 3K of event 'ref-cycles'
# Event count (approx.): 3153797218
#
# Overhead Command Shared Object Symbol
# ........ ....... ................. ..........................
#
99.84% noploop noploop [.] main
0.07% noploop ld-2.15.so [.] strcmp
0.03% noploop [kernel.kallsyms] [k] timerqueue_del
0.03% noploop [kernel.kallsyms] [k] sched_clock_cpu
0.02% noploop [kernel.kallsyms] [k] account_user_time
0.01% noploop [kernel.kallsyms] [k] __alloc_pages_nodemask
0.00% noploop [kernel.kallsyms] [k] native_write_msr_safe

# Samples: 3K of event 'cycles'
# Event count (approx.): 3722310525
#
# Overhead Command Shared Object Symbol
# ........ ....... ................. .........................
#
99.76% noploop noploop [.] main
0.11% noploop [kernel.kallsyms] [k] _raw_spin_lock
0.06% noploop [kernel.kallsyms] [k] find_get_page
0.03% noploop [kernel.kallsyms] [k] sched_clock_cpu
0.02% noploop [kernel.kallsyms] [k] rcu_check_callbacks
0.02% noploop [kernel.kallsyms] [k] __current_kernel_time
0.00% noploop [kernel.kallsyms] [k] native_write_msr_safe

In this case the event group information will be shown in the end of
header area. So you can use --group option to enable event group view.

$ perf report --group
...
# group: {ref-cycles,cycles}
# ========
#
# Samples: 7K of event 'anon group { ref-cycles, cycles }'
# Event count (approx.): 6876107743
#
# Overhead Command Shared Object Symbol
# ................ ....... ................. ..........................
#
99.84% 99.76% noploop noploop [.] main
0.07% 0.00% noploop ld-2.15.so [.] strcmp
0.03% 0.00% noploop [kernel.kallsyms] [k] timerqueue_del
0.03% 0.03% noploop [kernel.kallsyms] [k] sched_clock_cpu
0.02% 0.00% noploop [kernel.kallsyms] [k] account_user_time
0.01% 0.00% noploop [kernel.kallsyms] [k] __alloc_pages_nodemask
0.00% 0.00% noploop [kernel.kallsyms] [k] native_write_msr_safe
0.00% 0.11% noploop [kernel.kallsyms] [k] _raw_spin_lock
0.00% 0.06% noploop [kernel.kallsyms] [k] find_get_page
0.00% 0.02% noploop [kernel.kallsyms] [k] rcu_check_callbacks
0.00% 0.02% noploop [kernel.kallsyms] [k] __current_kernel_time

As you can see the Overhead column now contains both of ref-cycles and
cycles and header line shows group information also - 'anon group {
ref-cycles, cycles }'. The output is sorted by period of group leader
first.

If perf.data file doesn't contain group information, this --group
option does nothing. So if you want enable event group view by
default you can set it in ~/.perfconfig file:

$ cat ~/.perfconfig
[report]
group = true

It can be overridden with command line if you want:

$ perf report --no-group

You can also get this on my 'perf/group-v9' branch in

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

Any comments are welcome, thanks.
Namhyung

Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Pekka Enberg <penberg@kernel.org>

v8 -> v9:
* split patches have multiple changes (Arnaldo)
* add --group option to perf evlist (Arnaldo)

v7 -> v8:
* rebase onto acme/perf/core
* patch 3 in the previous version is merged
* add Jiri's Acked-by's

v6 -> v7:
* hists__{match,link} changes are merged separately
* factor out inc_group_count() from parsing group_def (Jiri)
* add checking for group fields in evlist/evsel (Jiri)
* check return value of during header processing (Arnaldo)
* get rid of a temporal array in hpp functions (Arnaldo)
* convert hpp macros to static inline functions (Jiri)

v5 -> v6:
* set ->leader alse for leader evsel (Arnaldo)
* use hists__{match,link} (Arnaldo)

v4 -> v5:
* rebase onto acme/perf/core

v3 -> v4:
* patch 1-9 in previous post are merged.
* add Jiri's Acked-by
* add report.group config option

v2 -> v3:
* drop patch 1 since it's merged into acme/perf/core
* cherry-pick Jiri's hpp changes
* add missing bswap_32 on reading nr_groups (Jiri)
* remove perf_evlist__recalc_nr_groups() in favor of list_is_last (Jiri)

v1 -> v2:
* save group relation to header (Jiri)

Namhyung Kim (19):
perf tools: Keep group information
perf tests: Add group test conditions
perf header: Add HEADER_GROUP_DESC feature
perf report: Make another loop for linking group hists
perf hists: Resort hist entries using group members for output
perf ui/hist: Consolidate hpp helpers
perf hist browser: Convert hpp helpers to a function
perf gtk/browser: Convert hpp helpers to a function
perf ui/hist: Add support for event group view
perf hist browser: Move coloring logic to hpp functions
perf hist browser: Add suppport for event group view
perf gtk/browser: Add support for event group view
perf tools: Move ltrim() to util/string.c
perf gtk/browser: Trim column header string when event group enabled
perf report: Bypass non-leader events when event group is enabled
perf report: Show group description when event group is enabled
perf report: Add --group option
perf report: Add report.group config option
perf evlist: Add --group option

tools/perf/Documentation/perf-evlist.txt | 4 +
tools/perf/Documentation/perf-report.txt | 3 +
tools/perf/builtin-evlist.c | 7 +
tools/perf/builtin-record.c | 3 +
tools/perf/builtin-report.c | 47 ++++-
tools/perf/builtin-script.c | 12 --
tools/perf/tests/parse-events.c | 28 +++
tools/perf/ui/browsers/hists.c | 217 ++++++++++++++++++----
tools/perf/ui/gtk/hists.c | 130 ++++++++++---
tools/perf/ui/hist.c | 306 +++++++++++++++----------------
tools/perf/ui/stdio/hist.c | 2 +
tools/perf/util/evlist.c | 7 +-
tools/perf/util/evlist.h | 1 +
tools/perf/util/evsel.c | 49 ++++-
tools/perf/util/evsel.h | 16 ++
tools/perf/util/header.c | 164 +++++++++++++++++
tools/perf/util/header.h | 2 +
tools/perf/util/hist.c | 59 +++++-
tools/perf/util/parse-events.c | 1 +
tools/perf/util/parse-events.h | 1 +
tools/perf/util/parse-events.y | 10 +
tools/perf/util/string.c | 18 ++
tools/perf/util/symbol.h | 3 +-
tools/perf/util/util.h | 1 +
24 files changed, 855 insertions(+), 236 deletions(-)

--
1.7.11.7