diff options
-rw-r--r-- | tools/perf/builtin-record.c | 11 | ||||
-rw-r--r-- | tools/perf/builtin-stat.c | 20 | ||||
-rw-r--r-- | tools/perf/builtin-test.c | 6 | ||||
-rw-r--r-- | tools/perf/builtin-top.c | 11 | ||||
-rw-r--r-- | tools/perf/util/evlist.c | 30 | ||||
-rw-r--r-- | tools/perf/util/evlist.h | 2 | ||||
-rw-r--r-- | tools/perf/util/evsel.c | 43 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 10 | ||||
-rw-r--r-- | tools/perf/util/python.c | 31 |
9 files changed, 135 insertions, 29 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index f82480fa7f27..40088a5848d6 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -262,13 +262,16 @@ static bool perf_evlist__equal(struct perf_evlist *evlist, | |||
262 | 262 | ||
263 | static void open_counters(struct perf_evlist *evlist) | 263 | static void open_counters(struct perf_evlist *evlist) |
264 | { | 264 | { |
265 | struct perf_evsel *pos; | 265 | struct perf_evsel *pos, *first; |
266 | 266 | ||
267 | if (evlist->cpus->map[0] < 0) | 267 | if (evlist->cpus->map[0] < 0) |
268 | no_inherit = true; | 268 | no_inherit = true; |
269 | 269 | ||
270 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
271 | |||
270 | list_for_each_entry(pos, &evlist->entries, node) { | 272 | list_for_each_entry(pos, &evlist->entries, node) { |
271 | struct perf_event_attr *attr = &pos->attr; | 273 | struct perf_event_attr *attr = &pos->attr; |
274 | struct xyarray *group_fd = NULL; | ||
272 | /* | 275 | /* |
273 | * Check if parse_single_tracepoint_event has already asked for | 276 | * Check if parse_single_tracepoint_event has already asked for |
274 | * PERF_SAMPLE_TIME. | 277 | * PERF_SAMPLE_TIME. |
@@ -283,11 +286,15 @@ static void open_counters(struct perf_evlist *evlist) | |||
283 | */ | 286 | */ |
284 | bool time_needed = attr->sample_type & PERF_SAMPLE_TIME; | 287 | bool time_needed = attr->sample_type & PERF_SAMPLE_TIME; |
285 | 288 | ||
289 | if (group && pos != first) | ||
290 | group_fd = first->fd; | ||
291 | |||
286 | config_attr(pos, evlist); | 292 | config_attr(pos, evlist); |
287 | retry_sample_id: | 293 | retry_sample_id: |
288 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; | 294 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; |
289 | try_again: | 295 | try_again: |
290 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group) < 0) { | 296 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group, |
297 | group_fd) < 0) { | ||
291 | int err = errno; | 298 | int err = errno; |
292 | 299 | ||
293 | if (err == EPERM || err == EACCES) { | 300 | if (err == EPERM || err == EACCES) { |
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 7ce65f52415e..7d98676808d8 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
@@ -278,9 +278,14 @@ struct stats runtime_itlb_cache_stats[MAX_NR_CPUS]; | |||
278 | struct stats runtime_dtlb_cache_stats[MAX_NR_CPUS]; | 278 | struct stats runtime_dtlb_cache_stats[MAX_NR_CPUS]; |
279 | struct stats walltime_nsecs_stats; | 279 | struct stats walltime_nsecs_stats; |
280 | 280 | ||
281 | static int create_perf_stat_counter(struct perf_evsel *evsel) | 281 | static int create_perf_stat_counter(struct perf_evsel *evsel, |
282 | struct perf_evsel *first) | ||
282 | { | 283 | { |
283 | struct perf_event_attr *attr = &evsel->attr; | 284 | struct perf_event_attr *attr = &evsel->attr; |
285 | struct xyarray *group_fd = NULL; | ||
286 | |||
287 | if (group && evsel != first) | ||
288 | group_fd = first->fd; | ||
284 | 289 | ||
285 | if (scale) | 290 | if (scale) |
286 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | | 291 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | |
@@ -289,14 +294,15 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) | |||
289 | attr->inherit = !no_inherit; | 294 | attr->inherit = !no_inherit; |
290 | 295 | ||
291 | if (system_wide) | 296 | if (system_wide) |
292 | return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, group); | 297 | return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, |
293 | 298 | group, group_fd); | |
294 | if (target_pid == -1 && target_tid == -1) { | 299 | if (target_pid == -1 && target_tid == -1) { |
295 | attr->disabled = 1; | 300 | attr->disabled = 1; |
296 | attr->enable_on_exec = 1; | 301 | attr->enable_on_exec = 1; |
297 | } | 302 | } |
298 | 303 | ||
299 | return perf_evsel__open_per_thread(evsel, evsel_list->threads, group); | 304 | return perf_evsel__open_per_thread(evsel, evsel_list->threads, |
305 | group, group_fd); | ||
300 | } | 306 | } |
301 | 307 | ||
302 | /* | 308 | /* |
@@ -396,7 +402,7 @@ static int read_counter(struct perf_evsel *counter) | |||
396 | static int run_perf_stat(int argc __used, const char **argv) | 402 | static int run_perf_stat(int argc __used, const char **argv) |
397 | { | 403 | { |
398 | unsigned long long t0, t1; | 404 | unsigned long long t0, t1; |
399 | struct perf_evsel *counter; | 405 | struct perf_evsel *counter, *first; |
400 | int status = 0; | 406 | int status = 0; |
401 | int child_ready_pipe[2], go_pipe[2]; | 407 | int child_ready_pipe[2], go_pipe[2]; |
402 | const bool forks = (argc > 0); | 408 | const bool forks = (argc > 0); |
@@ -453,8 +459,10 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
453 | close(child_ready_pipe[0]); | 459 | close(child_ready_pipe[0]); |
454 | } | 460 | } |
455 | 461 | ||
462 | first = list_entry(evsel_list->entries.next, struct perf_evsel, node); | ||
463 | |||
456 | list_for_each_entry(counter, &evsel_list->entries, node) { | 464 | list_for_each_entry(counter, &evsel_list->entries, node) { |
457 | if (create_perf_stat_counter(counter) < 0) { | 465 | if (create_perf_stat_counter(counter, first) < 0) { |
458 | if (errno == EINVAL || errno == ENOSYS || errno == ENOENT) { | 466 | if (errno == EINVAL || errno == ENOSYS || errno == ENOENT) { |
459 | if (verbose) | 467 | if (verbose) |
460 | ui__warning("%s event is not supported by the kernel.\n", | 468 | ui__warning("%s event is not supported by the kernel.\n", |
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index efe696f936e2..831d1baeac37 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
@@ -291,7 +291,7 @@ static int test__open_syscall_event(void) | |||
291 | goto out_thread_map_delete; | 291 | goto out_thread_map_delete; |
292 | } | 292 | } |
293 | 293 | ||
294 | if (perf_evsel__open_per_thread(evsel, threads, false) < 0) { | 294 | if (perf_evsel__open_per_thread(evsel, threads, false, NULL) < 0) { |
295 | pr_debug("failed to open counter: %s, " | 295 | pr_debug("failed to open counter: %s, " |
296 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", | 296 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", |
297 | strerror(errno)); | 297 | strerror(errno)); |
@@ -366,7 +366,7 @@ static int test__open_syscall_event_on_all_cpus(void) | |||
366 | goto out_thread_map_delete; | 366 | goto out_thread_map_delete; |
367 | } | 367 | } |
368 | 368 | ||
369 | if (perf_evsel__open(evsel, cpus, threads, false) < 0) { | 369 | if (perf_evsel__open(evsel, cpus, threads, false, NULL) < 0) { |
370 | pr_debug("failed to open counter: %s, " | 370 | pr_debug("failed to open counter: %s, " |
371 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", | 371 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", |
372 | strerror(errno)); | 372 | strerror(errno)); |
@@ -531,7 +531,7 @@ static int test__basic_mmap(void) | |||
531 | 531 | ||
532 | perf_evlist__add(evlist, evsels[i]); | 532 | perf_evlist__add(evlist, evsels[i]); |
533 | 533 | ||
534 | if (perf_evsel__open(evsels[i], cpus, threads, false) < 0) { | 534 | if (perf_evsel__open(evsels[i], cpus, threads, false, NULL) < 0) { |
535 | pr_debug("failed to open counter: %s, " | 535 | pr_debug("failed to open counter: %s, " |
536 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", | 536 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", |
537 | strerror(errno)); | 537 | strerror(errno)); |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 7a871714d44e..d2fc7542e826 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -834,10 +834,16 @@ static void perf_session__mmap_read(struct perf_session *self) | |||
834 | 834 | ||
835 | static void start_counters(struct perf_evlist *evlist) | 835 | static void start_counters(struct perf_evlist *evlist) |
836 | { | 836 | { |
837 | struct perf_evsel *counter; | 837 | struct perf_evsel *counter, *first; |
838 | |||
839 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
838 | 840 | ||
839 | list_for_each_entry(counter, &evlist->entries, node) { | 841 | list_for_each_entry(counter, &evlist->entries, node) { |
840 | struct perf_event_attr *attr = &counter->attr; | 842 | struct perf_event_attr *attr = &counter->attr; |
843 | struct xyarray *group_fd = NULL; | ||
844 | |||
845 | if (group && counter != first) | ||
846 | group_fd = first->fd; | ||
841 | 847 | ||
842 | attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID; | 848 | attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID; |
843 | 849 | ||
@@ -860,7 +866,8 @@ static void start_counters(struct perf_evlist *evlist) | |||
860 | attr->inherit = inherit; | 866 | attr->inherit = inherit; |
861 | try_again: | 867 | try_again: |
862 | if (perf_evsel__open(counter, top.evlist->cpus, | 868 | if (perf_evsel__open(counter, top.evlist->cpus, |
863 | top.evlist->threads, group) < 0) { | 869 | top.evlist->threads, group, |
870 | group_fd) < 0) { | ||
864 | int err = errno; | 871 | int err = errno; |
865 | 872 | ||
866 | if (err == EPERM || err == EACCES) { | 873 | if (err == EPERM || err == EACCES) { |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 2f6bc89027da..fbb4b4ab9cc6 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -539,3 +539,33 @@ void perf_evlist__set_selected(struct perf_evlist *evlist, | |||
539 | { | 539 | { |
540 | evlist->selected = evsel; | 540 | evlist->selected = evsel; |
541 | } | 541 | } |
542 | |||
543 | int perf_evlist__open(struct perf_evlist *evlist, bool group) | ||
544 | { | ||
545 | struct perf_evsel *evsel, *first; | ||
546 | int err, ncpus, nthreads; | ||
547 | |||
548 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
549 | |||
550 | list_for_each_entry(evsel, &evlist->entries, node) { | ||
551 | struct xyarray *group_fd = NULL; | ||
552 | |||
553 | if (group && evsel != first) | ||
554 | group_fd = first->fd; | ||
555 | |||
556 | err = perf_evsel__open(evsel, evlist->cpus, evlist->threads, | ||
557 | group, group_fd); | ||
558 | if (err < 0) | ||
559 | goto out_err; | ||
560 | } | ||
561 | |||
562 | return 0; | ||
563 | out_err: | ||
564 | ncpus = evlist->cpus ? evlist->cpus->nr : 1; | ||
565 | nthreads = evlist->threads ? evlist->threads->nr : 1; | ||
566 | |||
567 | list_for_each_entry_reverse(evsel, &evlist->entries, node) | ||
568 | perf_evsel__close(evsel, ncpus, nthreads); | ||
569 | |||
570 | return err; | ||
571 | } | ||
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 6be71fc57794..1779ffef7828 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
@@ -50,6 +50,8 @@ struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id); | |||
50 | 50 | ||
51 | union perf_event *perf_evlist__mmap_read(struct perf_evlist *self, int idx); | 51 | union perf_event *perf_evlist__mmap_read(struct perf_evlist *self, int idx); |
52 | 52 | ||
53 | int perf_evlist__open(struct perf_evlist *evlist, bool group); | ||
54 | |||
53 | int perf_evlist__alloc_mmap(struct perf_evlist *evlist); | 55 | int perf_evlist__alloc_mmap(struct perf_evlist *evlist); |
54 | int perf_evlist__mmap(struct perf_evlist *evlist, int pages, bool overwrite); | 56 | int perf_evlist__mmap(struct perf_evlist *evlist, int pages, bool overwrite); |
55 | void perf_evlist__munmap(struct perf_evlist *evlist); | 57 | void perf_evlist__munmap(struct perf_evlist *evlist); |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index b46f6e4bff3c..e42626422587 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include "thread_map.h" | 16 | #include "thread_map.h" |
17 | 17 | ||
18 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) | 18 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) |
19 | #define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0)) | ||
19 | 20 | ||
20 | int __perf_evsel__sample_size(u64 sample_type) | 21 | int __perf_evsel__sample_size(u64 sample_type) |
21 | { | 22 | { |
@@ -204,15 +205,16 @@ int __perf_evsel__read(struct perf_evsel *evsel, | |||
204 | } | 205 | } |
205 | 206 | ||
206 | static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | 207 | static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, |
207 | struct thread_map *threads, bool group) | 208 | struct thread_map *threads, bool group, |
209 | struct xyarray *group_fds) | ||
208 | { | 210 | { |
209 | int cpu, thread; | 211 | int cpu, thread; |
210 | unsigned long flags = 0; | 212 | unsigned long flags = 0; |
211 | int pid = -1; | 213 | int pid = -1, err; |
212 | 214 | ||
213 | if (evsel->fd == NULL && | 215 | if (evsel->fd == NULL && |
214 | perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0) | 216 | perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0) |
215 | return -1; | 217 | return -ENOMEM; |
216 | 218 | ||
217 | if (evsel->cgrp) { | 219 | if (evsel->cgrp) { |
218 | flags = PERF_FLAG_PID_CGROUP; | 220 | flags = PERF_FLAG_PID_CGROUP; |
@@ -220,7 +222,7 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | |||
220 | } | 222 | } |
221 | 223 | ||
222 | for (cpu = 0; cpu < cpus->nr; cpu++) { | 224 | for (cpu = 0; cpu < cpus->nr; cpu++) { |
223 | int group_fd = -1; | 225 | int group_fd = group_fds ? GROUP_FD(group_fds, cpu) : -1; |
224 | 226 | ||
225 | for (thread = 0; thread < threads->nr; thread++) { | 227 | for (thread = 0; thread < threads->nr; thread++) { |
226 | 228 | ||
@@ -231,8 +233,10 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | |||
231 | pid, | 233 | pid, |
232 | cpus->map[cpu], | 234 | cpus->map[cpu], |
233 | group_fd, flags); | 235 | group_fd, flags); |
234 | if (FD(evsel, cpu, thread) < 0) | 236 | if (FD(evsel, cpu, thread) < 0) { |
237 | err = -errno; | ||
235 | goto out_close; | 238 | goto out_close; |
239 | } | ||
236 | 240 | ||
237 | if (group && group_fd == -1) | 241 | if (group && group_fd == -1) |
238 | group_fd = FD(evsel, cpu, thread); | 242 | group_fd = FD(evsel, cpu, thread); |
@@ -249,7 +253,17 @@ out_close: | |||
249 | } | 253 | } |
250 | thread = threads->nr; | 254 | thread = threads->nr; |
251 | } while (--cpu >= 0); | 255 | } while (--cpu >= 0); |
252 | return -1; | 256 | return err; |
257 | } | ||
258 | |||
259 | void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads) | ||
260 | { | ||
261 | if (evsel->fd == NULL) | ||
262 | return; | ||
263 | |||
264 | perf_evsel__close_fd(evsel, ncpus, nthreads); | ||
265 | perf_evsel__free_fd(evsel); | ||
266 | evsel->fd = NULL; | ||
253 | } | 267 | } |
254 | 268 | ||
255 | static struct { | 269 | static struct { |
@@ -269,7 +283,8 @@ static struct { | |||
269 | }; | 283 | }; |
270 | 284 | ||
271 | int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | 285 | int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, |
272 | struct thread_map *threads, bool group) | 286 | struct thread_map *threads, bool group, |
287 | struct xyarray *group_fd) | ||
273 | { | 288 | { |
274 | if (cpus == NULL) { | 289 | if (cpus == NULL) { |
275 | /* Work around old compiler warnings about strict aliasing */ | 290 | /* Work around old compiler warnings about strict aliasing */ |
@@ -279,19 +294,23 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | |||
279 | if (threads == NULL) | 294 | if (threads == NULL) |
280 | threads = &empty_thread_map.map; | 295 | threads = &empty_thread_map.map; |
281 | 296 | ||
282 | return __perf_evsel__open(evsel, cpus, threads, group); | 297 | return __perf_evsel__open(evsel, cpus, threads, group, group_fd); |
283 | } | 298 | } |
284 | 299 | ||
285 | int perf_evsel__open_per_cpu(struct perf_evsel *evsel, | 300 | int perf_evsel__open_per_cpu(struct perf_evsel *evsel, |
286 | struct cpu_map *cpus, bool group) | 301 | struct cpu_map *cpus, bool group, |
302 | struct xyarray *group_fd) | ||
287 | { | 303 | { |
288 | return __perf_evsel__open(evsel, cpus, &empty_thread_map.map, group); | 304 | return __perf_evsel__open(evsel, cpus, &empty_thread_map.map, group, |
305 | group_fd); | ||
289 | } | 306 | } |
290 | 307 | ||
291 | int perf_evsel__open_per_thread(struct perf_evsel *evsel, | 308 | int perf_evsel__open_per_thread(struct perf_evsel *evsel, |
292 | struct thread_map *threads, bool group) | 309 | struct thread_map *threads, bool group, |
310 | struct xyarray *group_fd) | ||
293 | { | 311 | { |
294 | return __perf_evsel__open(evsel, &empty_cpu_map.map, threads, group); | 312 | return __perf_evsel__open(evsel, &empty_cpu_map.map, threads, group, |
313 | group_fd); | ||
295 | } | 314 | } |
296 | 315 | ||
297 | static int perf_event__parse_id_sample(const union perf_event *event, u64 type, | 316 | static int perf_event__parse_id_sample(const union perf_event *event, u64 type, |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index e9a31554e265..b1d15e6f7ae3 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -82,11 +82,15 @@ void perf_evsel__free_id(struct perf_evsel *evsel); | |||
82 | void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); | 82 | void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); |
83 | 83 | ||
84 | int perf_evsel__open_per_cpu(struct perf_evsel *evsel, | 84 | int perf_evsel__open_per_cpu(struct perf_evsel *evsel, |
85 | struct cpu_map *cpus, bool group); | 85 | struct cpu_map *cpus, bool group, |
86 | struct xyarray *group_fds); | ||
86 | int perf_evsel__open_per_thread(struct perf_evsel *evsel, | 87 | int perf_evsel__open_per_thread(struct perf_evsel *evsel, |
87 | struct thread_map *threads, bool group); | 88 | struct thread_map *threads, bool group, |
89 | struct xyarray *group_fds); | ||
88 | int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | 90 | int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, |
89 | struct thread_map *threads, bool group); | 91 | struct thread_map *threads, bool group, |
92 | struct xyarray *group_fds); | ||
93 | void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads); | ||
90 | 94 | ||
91 | #define perf_evsel__match(evsel, t, c) \ | 95 | #define perf_evsel__match(evsel, t, c) \ |
92 | (evsel->attr.type == PERF_TYPE_##t && \ | 96 | (evsel->attr.type == PERF_TYPE_##t && \ |
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 7624324efad4..9dd47a4f2596 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c | |||
@@ -623,7 +623,11 @@ static PyObject *pyrf_evsel__open(struct pyrf_evsel *pevsel, | |||
623 | cpus = ((struct pyrf_cpu_map *)pcpus)->cpus; | 623 | cpus = ((struct pyrf_cpu_map *)pcpus)->cpus; |
624 | 624 | ||
625 | evsel->attr.inherit = inherit; | 625 | evsel->attr.inherit = inherit; |
626 | if (perf_evsel__open(evsel, cpus, threads, group) < 0) { | 626 | /* |
627 | * This will group just the fds for this single evsel, to group | ||
628 | * multiple events, use evlist.open(). | ||
629 | */ | ||
630 | if (perf_evsel__open(evsel, cpus, threads, group, NULL) < 0) { | ||
627 | PyErr_SetFromErrno(PyExc_OSError); | 631 | PyErr_SetFromErrno(PyExc_OSError); |
628 | return NULL; | 632 | return NULL; |
629 | } | 633 | } |
@@ -814,6 +818,25 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, | |||
814 | return Py_None; | 818 | return Py_None; |
815 | } | 819 | } |
816 | 820 | ||
821 | static PyObject *pyrf_evlist__open(struct pyrf_evlist *pevlist, | ||
822 | PyObject *args, PyObject *kwargs) | ||
823 | { | ||
824 | struct perf_evlist *evlist = &pevlist->evlist; | ||
825 | int group = 0; | ||
826 | static char *kwlist[] = { "group", NULL }; | ||
827 | |||
828 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOii", kwlist, &group)) | ||
829 | return NULL; | ||
830 | |||
831 | if (perf_evlist__open(evlist, group) < 0) { | ||
832 | PyErr_SetFromErrno(PyExc_OSError); | ||
833 | return NULL; | ||
834 | } | ||
835 | |||
836 | Py_INCREF(Py_None); | ||
837 | return Py_None; | ||
838 | } | ||
839 | |||
817 | static PyMethodDef pyrf_evlist__methods[] = { | 840 | static PyMethodDef pyrf_evlist__methods[] = { |
818 | { | 841 | { |
819 | .ml_name = "mmap", | 842 | .ml_name = "mmap", |
@@ -822,6 +845,12 @@ static PyMethodDef pyrf_evlist__methods[] = { | |||
822 | .ml_doc = PyDoc_STR("mmap the file descriptor table.") | 845 | .ml_doc = PyDoc_STR("mmap the file descriptor table.") |
823 | }, | 846 | }, |
824 | { | 847 | { |
848 | .ml_name = "open", | ||
849 | .ml_meth = (PyCFunction)pyrf_evlist__open, | ||
850 | .ml_flags = METH_VARARGS | METH_KEYWORDS, | ||
851 | .ml_doc = PyDoc_STR("open the file descriptors.") | ||
852 | }, | ||
853 | { | ||
825 | .ml_name = "poll", | 854 | .ml_name = "poll", |
826 | .ml_meth = (PyCFunction)pyrf_evlist__poll, | 855 | .ml_meth = (PyCFunction)pyrf_evlist__poll, |
827 | .ml_flags = METH_VARARGS | METH_KEYWORDS, | 856 | .ml_flags = METH_VARARGS | METH_KEYWORDS, |