diff options
author | Namhyung Kim <namhyung.kim@lge.com> | 2013-01-22 04:09:29 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-01-31 11:07:43 -0500 |
commit | 97f63e4a2cf88e9d7bc086a1c3f10fa41c9174df (patch) | |
tree | c143cd0b6758fbfe59eb80ba346ccc943c7e589c /tools/perf | |
parent | 0de233b9c4f8c83b2cb655bfdbec306c8da81199 (diff) |
perf tools: Keep group information
Add a few of group-related field in struct perf_{evlist,evsel} so that
the group information in a evlist can be known easily. It only counts
groups which have more than 1 members since leader-only groups are
treated as non-group events.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1358845787-1350-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/evlist.c | 7 | ||||
-rw-r--r-- | tools/perf/util/evlist.h | 1 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 6 | ||||
-rw-r--r-- | tools/perf/util/parse-events.c | 1 | ||||
-rw-r--r-- | tools/perf/util/parse-events.h | 1 | ||||
-rw-r--r-- | tools/perf/util/parse-events.y | 10 |
6 files changed, 25 insertions, 1 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index dc8aee97a488..eddd5ebcd690 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -117,6 +117,9 @@ void __perf_evlist__set_leader(struct list_head *list) | |||
117 | struct perf_evsel *evsel, *leader; | 117 | struct perf_evsel *evsel, *leader; |
118 | 118 | ||
119 | leader = list_entry(list->next, struct perf_evsel, node); | 119 | leader = list_entry(list->next, struct perf_evsel, node); |
120 | evsel = list_entry(list->prev, struct perf_evsel, node); | ||
121 | |||
122 | leader->nr_members = evsel->idx - leader->idx + 1; | ||
120 | 123 | ||
121 | list_for_each_entry(evsel, list, node) { | 124 | list_for_each_entry(evsel, list, node) { |
122 | if (evsel != leader) | 125 | if (evsel != leader) |
@@ -126,8 +129,10 @@ void __perf_evlist__set_leader(struct list_head *list) | |||
126 | 129 | ||
127 | void perf_evlist__set_leader(struct perf_evlist *evlist) | 130 | void perf_evlist__set_leader(struct perf_evlist *evlist) |
128 | { | 131 | { |
129 | if (evlist->nr_entries) | 132 | if (evlist->nr_entries) { |
133 | evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0; | ||
130 | __perf_evlist__set_leader(&evlist->entries); | 134 | __perf_evlist__set_leader(&evlist->entries); |
135 | } | ||
131 | } | 136 | } |
132 | 137 | ||
133 | int perf_evlist__add_default(struct perf_evlist *evlist) | 138 | int perf_evlist__add_default(struct perf_evlist *evlist) |
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 457e2350d21d..73579a25a93e 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
@@ -21,6 +21,7 @@ struct perf_evlist { | |||
21 | struct list_head entries; | 21 | struct list_head entries; |
22 | struct hlist_head heads[PERF_EVLIST__HLIST_SIZE]; | 22 | struct hlist_head heads[PERF_EVLIST__HLIST_SIZE]; |
23 | int nr_entries; | 23 | int nr_entries; |
24 | int nr_groups; | ||
24 | int nr_fds; | 25 | int nr_fds; |
25 | int nr_mmaps; | 26 | int nr_mmaps; |
26 | int mmap_len; | 27 | int mmap_len; |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index cbf42322a27e..c9031ebf196e 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -74,6 +74,7 @@ struct perf_evsel { | |||
74 | bool needs_swap; | 74 | bool needs_swap; |
75 | /* parse modifier helper */ | 75 | /* parse modifier helper */ |
76 | int exclude_GH; | 76 | int exclude_GH; |
77 | int nr_members; | ||
77 | struct perf_evsel *leader; | 78 | struct perf_evsel *leader; |
78 | char *group_name; | 79 | char *group_name; |
79 | }; | 80 | }; |
@@ -259,4 +260,9 @@ bool perf_evsel__fallback(struct perf_evsel *evsel, int err, | |||
259 | int perf_evsel__open_strerror(struct perf_evsel *evsel, | 260 | int perf_evsel__open_strerror(struct perf_evsel *evsel, |
260 | struct perf_target *target, | 261 | struct perf_target *target, |
261 | int err, char *msg, size_t size); | 262 | int err, char *msg, size_t size); |
263 | |||
264 | static inline int perf_evsel__group_idx(struct perf_evsel *evsel) | ||
265 | { | ||
266 | return evsel->idx - evsel->leader->idx; | ||
267 | } | ||
262 | #endif /* __PERF_EVSEL_H */ | 268 | #endif /* __PERF_EVSEL_H */ |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 02f6421f03a0..4e0f5c2a9fda 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -884,6 +884,7 @@ int parse_events(struct perf_evlist *evlist, const char *str) | |||
884 | if (!ret) { | 884 | if (!ret) { |
885 | int entries = data.idx - evlist->nr_entries; | 885 | int entries = data.idx - evlist->nr_entries; |
886 | perf_evlist__splice_list_tail(evlist, &data.list, entries); | 886 | perf_evlist__splice_list_tail(evlist, &data.list, entries); |
887 | evlist->nr_groups += data.nr_groups; | ||
887 | return 0; | 888 | return 0; |
888 | } | 889 | } |
889 | 890 | ||
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 2cd2c42a69c5..8a4859315fd9 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h | |||
@@ -64,6 +64,7 @@ struct parse_events_term { | |||
64 | struct parse_events_evlist { | 64 | struct parse_events_evlist { |
65 | struct list_head list; | 65 | struct list_head list; |
66 | int idx; | 66 | int idx; |
67 | int nr_groups; | ||
67 | }; | 68 | }; |
68 | 69 | ||
69 | struct parse_events_terms { | 70 | struct parse_events_terms { |
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 9d43c86176ff..4de2fdca98c8 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y | |||
@@ -23,6 +23,14 @@ do { \ | |||
23 | YYABORT; \ | 23 | YYABORT; \ |
24 | } while (0) | 24 | } while (0) |
25 | 25 | ||
26 | static inc_group_count(struct list_head *list, | ||
27 | struct parse_events_evlist *data) | ||
28 | { | ||
29 | /* Count groups only have more than 1 members */ | ||
30 | if (!list_is_last(list->next, list)) | ||
31 | data->nr_groups++; | ||
32 | } | ||
33 | |||
26 | %} | 34 | %} |
27 | 35 | ||
28 | %token PE_START_EVENTS PE_START_TERMS | 36 | %token PE_START_EVENTS PE_START_TERMS |
@@ -123,6 +131,7 @@ PE_NAME '{' events '}' | |||
123 | { | 131 | { |
124 | struct list_head *list = $3; | 132 | struct list_head *list = $3; |
125 | 133 | ||
134 | inc_group_count(list, _data); | ||
126 | parse_events__set_leader($1, list); | 135 | parse_events__set_leader($1, list); |
127 | $$ = list; | 136 | $$ = list; |
128 | } | 137 | } |
@@ -131,6 +140,7 @@ PE_NAME '{' events '}' | |||
131 | { | 140 | { |
132 | struct list_head *list = $2; | 141 | struct list_head *list = $2; |
133 | 142 | ||
143 | inc_group_count(list, _data); | ||
134 | parse_events__set_leader(NULL, list); | 144 | parse_events__set_leader(NULL, list); |
135 | $$ = list; | 145 | $$ = list; |
136 | } | 146 | } |