diff options
Diffstat (limited to 'tools/perf/util/evlist.c')
-rw-r--r-- | tools/perf/util/evlist.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 705293489e3c..bc4ad7977438 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -49,10 +49,16 @@ struct perf_evlist *perf_evlist__new(struct cpu_map *cpus, | |||
49 | return evlist; | 49 | return evlist; |
50 | } | 50 | } |
51 | 51 | ||
52 | void perf_evlist__config_attrs(struct perf_evlist *evlist, | 52 | void perf_evlist__config(struct perf_evlist *evlist, |
53 | struct perf_record_opts *opts) | 53 | struct perf_record_opts *opts) |
54 | { | 54 | { |
55 | struct perf_evsel *evsel; | 55 | struct perf_evsel *evsel; |
56 | /* | ||
57 | * Set the evsel leader links before we configure attributes, | ||
58 | * since some might depend on this info. | ||
59 | */ | ||
60 | if (opts->group) | ||
61 | perf_evlist__set_leader(evlist); | ||
56 | 62 | ||
57 | if (evlist->cpus->map[0] < 0) | 63 | if (evlist->cpus->map[0] < 0) |
58 | opts->no_inherit = true; | 64 | opts->no_inherit = true; |
@@ -61,7 +67,7 @@ void perf_evlist__config_attrs(struct perf_evlist *evlist, | |||
61 | perf_evsel__config(evsel, opts); | 67 | perf_evsel__config(evsel, opts); |
62 | 68 | ||
63 | if (evlist->nr_entries > 1) | 69 | if (evlist->nr_entries > 1) |
64 | evsel->attr.sample_type |= PERF_SAMPLE_ID; | 70 | perf_evsel__set_sample_id(evsel); |
65 | } | 71 | } |
66 | } | 72 | } |
67 | 73 | ||
@@ -111,18 +117,21 @@ void __perf_evlist__set_leader(struct list_head *list) | |||
111 | struct perf_evsel *evsel, *leader; | 117 | struct perf_evsel *evsel, *leader; |
112 | 118 | ||
113 | leader = list_entry(list->next, struct perf_evsel, node); | 119 | leader = list_entry(list->next, struct perf_evsel, node); |
114 | leader->leader = NULL; | 120 | evsel = list_entry(list->prev, struct perf_evsel, node); |
121 | |||
122 | leader->nr_members = evsel->idx - leader->idx + 1; | ||
115 | 123 | ||
116 | list_for_each_entry(evsel, list, node) { | 124 | list_for_each_entry(evsel, list, node) { |
117 | if (evsel != leader) | 125 | evsel->leader = leader; |
118 | evsel->leader = leader; | ||
119 | } | 126 | } |
120 | } | 127 | } |
121 | 128 | ||
122 | void perf_evlist__set_leader(struct perf_evlist *evlist) | 129 | void perf_evlist__set_leader(struct perf_evlist *evlist) |
123 | { | 130 | { |
124 | if (evlist->nr_entries) | 131 | if (evlist->nr_entries) { |
132 | evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0; | ||
125 | __perf_evlist__set_leader(&evlist->entries); | 133 | __perf_evlist__set_leader(&evlist->entries); |
134 | } | ||
126 | } | 135 | } |
127 | 136 | ||
128 | int perf_evlist__add_default(struct perf_evlist *evlist) | 137 | int perf_evlist__add_default(struct perf_evlist *evlist) |
@@ -222,7 +231,7 @@ void perf_evlist__disable(struct perf_evlist *evlist) | |||
222 | 231 | ||
223 | for (cpu = 0; cpu < evlist->cpus->nr; cpu++) { | 232 | for (cpu = 0; cpu < evlist->cpus->nr; cpu++) { |
224 | list_for_each_entry(pos, &evlist->entries, node) { | 233 | list_for_each_entry(pos, &evlist->entries, node) { |
225 | if (perf_evsel__is_group_member(pos)) | 234 | if (!perf_evsel__is_group_leader(pos)) |
226 | continue; | 235 | continue; |
227 | for (thread = 0; thread < evlist->threads->nr; thread++) | 236 | for (thread = 0; thread < evlist->threads->nr; thread++) |
228 | ioctl(FD(pos, cpu, thread), | 237 | ioctl(FD(pos, cpu, thread), |
@@ -238,7 +247,7 @@ void perf_evlist__enable(struct perf_evlist *evlist) | |||
238 | 247 | ||
239 | for (cpu = 0; cpu < cpu_map__nr(evlist->cpus); cpu++) { | 248 | for (cpu = 0; cpu < cpu_map__nr(evlist->cpus); cpu++) { |
240 | list_for_each_entry(pos, &evlist->entries, node) { | 249 | list_for_each_entry(pos, &evlist->entries, node) { |
241 | if (perf_evsel__is_group_member(pos)) | 250 | if (!perf_evsel__is_group_leader(pos)) |
242 | continue; | 251 | continue; |
243 | for (thread = 0; thread < evlist->threads->nr; thread++) | 252 | for (thread = 0; thread < evlist->threads->nr; thread++) |
244 | ioctl(FD(pos, cpu, thread), | 253 | ioctl(FD(pos, cpu, thread), |
@@ -366,7 +375,7 @@ union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx) | |||
366 | if ((old & md->mask) + size != ((old + size) & md->mask)) { | 375 | if ((old & md->mask) + size != ((old + size) & md->mask)) { |
367 | unsigned int offset = old; | 376 | unsigned int offset = old; |
368 | unsigned int len = min(sizeof(*event), size), cpy; | 377 | unsigned int len = min(sizeof(*event), size), cpy; |
369 | void *dst = &evlist->event_copy; | 378 | void *dst = &md->event_copy; |
370 | 379 | ||
371 | do { | 380 | do { |
372 | cpy = min(md->mask + 1 - (offset & md->mask), len); | 381 | cpy = min(md->mask + 1 - (offset & md->mask), len); |
@@ -376,7 +385,7 @@ union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx) | |||
376 | len -= cpy; | 385 | len -= cpy; |
377 | } while (len); | 386 | } while (len); |
378 | 387 | ||
379 | event = &evlist->event_copy; | 388 | event = &md->event_copy; |
380 | } | 389 | } |
381 | 390 | ||
382 | old += size; | 391 | old += size; |