diff options
Diffstat (limited to 'tools/perf/util/evlist.c')
-rw-r--r-- | tools/perf/util/evlist.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 3f16e08a5c8d..1986d8051bd1 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -51,13 +51,15 @@ struct perf_evlist *perf_evlist__new(struct cpu_map *cpus, | |||
51 | void perf_evlist__config_attrs(struct perf_evlist *evlist, | 51 | void perf_evlist__config_attrs(struct perf_evlist *evlist, |
52 | struct perf_record_opts *opts) | 52 | struct perf_record_opts *opts) |
53 | { | 53 | { |
54 | struct perf_evsel *evsel; | 54 | struct perf_evsel *evsel, *first; |
55 | 55 | ||
56 | if (evlist->cpus->map[0] < 0) | 56 | if (evlist->cpus->map[0] < 0) |
57 | opts->no_inherit = true; | 57 | opts->no_inherit = true; |
58 | 58 | ||
59 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
60 | |||
59 | list_for_each_entry(evsel, &evlist->entries, node) { | 61 | list_for_each_entry(evsel, &evlist->entries, node) { |
60 | perf_evsel__config(evsel, opts); | 62 | perf_evsel__config(evsel, opts, first); |
61 | 63 | ||
62 | if (evlist->nr_entries > 1) | 64 | if (evlist->nr_entries > 1) |
63 | evsel->attr.sample_type |= PERF_SAMPLE_ID; | 65 | evsel->attr.sample_type |= PERF_SAMPLE_ID; |
@@ -97,9 +99,9 @@ void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry) | |||
97 | ++evlist->nr_entries; | 99 | ++evlist->nr_entries; |
98 | } | 100 | } |
99 | 101 | ||
100 | static void perf_evlist__splice_list_tail(struct perf_evlist *evlist, | 102 | void perf_evlist__splice_list_tail(struct perf_evlist *evlist, |
101 | struct list_head *list, | 103 | struct list_head *list, |
102 | int nr_entries) | 104 | int nr_entries) |
103 | { | 105 | { |
104 | list_splice_tail(list, &evlist->entries); | 106 | list_splice_tail(list, &evlist->entries); |
105 | evlist->nr_entries += nr_entries; | 107 | evlist->nr_entries += nr_entries; |
@@ -349,6 +351,10 @@ struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id) | |||
349 | hlist_for_each_entry(sid, pos, head, node) | 351 | hlist_for_each_entry(sid, pos, head, node) |
350 | if (sid->id == id) | 352 | if (sid->id == id) |
351 | return sid->evsel; | 353 | return sid->evsel; |
354 | |||
355 | if (!perf_evlist__sample_id_all(evlist)) | ||
356 | return list_entry(evlist->entries.next, struct perf_evsel, node); | ||
357 | |||
352 | return NULL; | 358 | return NULL; |
353 | } | 359 | } |
354 | 360 | ||
@@ -593,15 +599,15 @@ int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages, | |||
593 | return perf_evlist__mmap_per_cpu(evlist, prot, mask); | 599 | return perf_evlist__mmap_per_cpu(evlist, prot, mask); |
594 | } | 600 | } |
595 | 601 | ||
596 | int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid, | 602 | int perf_evlist__create_maps(struct perf_evlist *evlist, const char *target_pid, |
597 | pid_t target_tid, const char *cpu_list) | 603 | const char *target_tid, uid_t uid, const char *cpu_list) |
598 | { | 604 | { |
599 | evlist->threads = thread_map__new(target_pid, target_tid); | 605 | evlist->threads = thread_map__new_str(target_pid, target_tid, uid); |
600 | 606 | ||
601 | if (evlist->threads == NULL) | 607 | if (evlist->threads == NULL) |
602 | return -1; | 608 | return -1; |
603 | 609 | ||
604 | if (cpu_list == NULL && target_tid != -1) | 610 | if (uid != UINT_MAX || (cpu_list == NULL && target_tid)) |
605 | evlist->cpus = cpu_map__dummy_new(); | 611 | evlist->cpus = cpu_map__dummy_new(); |
606 | else | 612 | else |
607 | evlist->cpus = cpu_map__new(cpu_list); | 613 | evlist->cpus = cpu_map__new(cpu_list); |
@@ -761,6 +767,7 @@ out_err: | |||
761 | list_for_each_entry_reverse(evsel, &evlist->entries, node) | 767 | list_for_each_entry_reverse(evsel, &evlist->entries, node) |
762 | perf_evsel__close(evsel, ncpus, nthreads); | 768 | perf_evsel__close(evsel, ncpus, nthreads); |
763 | 769 | ||
770 | errno = -err; | ||
764 | return err; | 771 | return err; |
765 | } | 772 | } |
766 | 773 | ||
@@ -820,7 +827,7 @@ int perf_evlist__prepare_workload(struct perf_evlist *evlist, | |||
820 | exit(-1); | 827 | exit(-1); |
821 | } | 828 | } |
822 | 829 | ||
823 | if (!opts->system_wide && opts->target_tid == -1 && opts->target_pid == -1) | 830 | if (!opts->system_wide && !opts->target_tid && !opts->target_pid) |
824 | evlist->threads->map[0] = evlist->workload.pid; | 831 | evlist->threads->map[0] = evlist->workload.pid; |
825 | 832 | ||
826 | close(child_ready_pipe[1]); | 833 | close(child_ready_pipe[1]); |