aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-top.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2012-08-08 06:22:36 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-08-14 16:03:49 -0400
commit6a4bb04caacc8c2d06f345130e9086e3fea38ca7 (patch)
tree96a4c4e049c303a92ababf2807b5b8044f55bf74 /tools/perf/builtin-top.c
parentf5b1135bf79557563a814e53ecd610cce663c1e3 (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.c12
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
887static void perf_top__start_counters(struct perf_top *top) 887static 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;
928try_again: 925try_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) {