diff options
author | Jiri Olsa <jolsa@redhat.com> | 2012-08-08 06:22:36 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-08-14 16:03:49 -0400 |
commit | 6a4bb04caacc8c2d06f345130e9086e3fea38ca7 (patch) | |
tree | 96a4c4e049c303a92ababf2807b5b8044f55bf74 /tools/perf/builtin-top.c | |
parent | f5b1135bf79557563a814e53ecd610cce663c1e3 (diff) |
perf tools: Enable grouping logic for parsed events
This patch adds a functionality that allows to create event groups
based on the way they are specified on the command line. Adding
functionality to the '{}' group syntax introduced in earlier patch.
The current '--group/-g' option behaviour remains intact. If you
specify it for record/stat/top command, all the specified events
become members of a single group with the first event as a group
leader.
With the new '{}' group syntax you can create group like:
# perf record -e '{cycles,faults}' ls
resulting in single event group containing 'cycles' and 'faults'
events, with cycles event as group leader.
All groups are created with regards to threads and cpus. Thus
recording an event group within a 2 threads on server with
4 CPUs will create 8 separate groups.
Examples (first event in brackets is group leader):
# 1 group (cpu-clock,task-clock)
perf record --group -e cpu-clock,task-clock ls
perf record -e '{cpu-clock,task-clock}' ls
# 2 groups (cpu-clock,task-clock) (minor-faults,major-faults)
perf record -e '{cpu-clock,task-clock},{minor-faults,major-faults}' ls
# 1 group (cpu-clock,task-clock,minor-faults,major-faults)
perf record --group -e cpu-clock,task-clock -e minor-faults,major-faults ls
perf record -e '{cpu-clock,task-clock,minor-faults,major-faults}' ls
# 2 groups (cpu-clock,task-clock) (minor-faults,major-faults)
perf record -e '{cpu-clock,task-clock} -e '{minor-faults,major-faults}' \
-e instructions ls
# 1 group
# (cpu-clock,task-clock,minor-faults,major-faults,instructions)
perf record --group -e cpu-clock,task-clock \
-e minor-faults,major-faults -e instructions ls perf record -e
'{cpu-clock,task-clock,minor-faults,major-faults,instructions}' ls
It's possible to use standard event modifier for a group, which spans
over all events in the group and updates each event modifier settings,
for example:
# perf record -r '{faults:k,cache-references}:p'
resulting in ':kp' modifier being used for 'faults' and ':p' modifier
being used for 'cache-references' event.
Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ulrich Drepper <drepper@gmail.com>
Link: http://lkml.kernel.org/n/tip-ho42u0wcr8mn1otkalqi13qp@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-top.c')
-rw-r--r-- | tools/perf/builtin-top.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index e45a1ba61722..392d2192b75e 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -886,17 +886,14 @@ static void perf_top__mmap_read(struct perf_top *top) | |||
886 | 886 | ||
887 | static void perf_top__start_counters(struct perf_top *top) | 887 | static void perf_top__start_counters(struct perf_top *top) |
888 | { | 888 | { |
889 | struct perf_evsel *counter, *first; | 889 | struct perf_evsel *counter; |
890 | struct perf_evlist *evlist = top->evlist; | 890 | struct perf_evlist *evlist = top->evlist; |
891 | 891 | ||
892 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | 892 | if (top->group) |
893 | perf_evlist__group(evlist); | ||
893 | 894 | ||
894 | list_for_each_entry(counter, &evlist->entries, node) { | 895 | list_for_each_entry(counter, &evlist->entries, node) { |
895 | struct perf_event_attr *attr = &counter->attr; | 896 | struct perf_event_attr *attr = &counter->attr; |
896 | struct xyarray *group_fd = NULL; | ||
897 | |||
898 | if (top->group && counter != first) | ||
899 | group_fd = first->fd; | ||
900 | 897 | ||
901 | attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID; | 898 | attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID; |
902 | 899 | ||
@@ -927,8 +924,7 @@ retry_sample_id: | |||
927 | attr->sample_id_all = top->sample_id_all_missing ? 0 : 1; | 924 | attr->sample_id_all = top->sample_id_all_missing ? 0 : 1; |
928 | try_again: | 925 | try_again: |
929 | if (perf_evsel__open(counter, top->evlist->cpus, | 926 | if (perf_evsel__open(counter, top->evlist->cpus, |
930 | top->evlist->threads, top->group, | 927 | top->evlist->threads) < 0) { |
931 | group_fd) < 0) { | ||
932 | int err = errno; | 928 | int err = errno; |
933 | 929 | ||
934 | if (err == EPERM || err == EACCES) { | 930 | if (err == EPERM || err == EACCES) { |