perf evlist: Move the mmap array from perf_evsel
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / tools / perf / util / evlist.c
1 #include <poll.h>
2 #include "evlist.h"
3 #include "evsel.h"
4 #include "util.h"
5
6 #include <linux/bitops.h>
7 #include <linux/hash.h>
8
9 struct perf_evlist *perf_evlist__new(void)
10 {
11 struct perf_evlist *evlist = zalloc(sizeof(*evlist));
12
13 if (evlist != NULL) {
14 int i;
15
16 for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i)
17 INIT_HLIST_HEAD(&evlist->heads[i]);
18 INIT_LIST_HEAD(&evlist->entries);
19 }
20
21 return evlist;
22 }
23
24 static void perf_evlist__purge(struct perf_evlist *evlist)
25 {
26 struct perf_evsel *pos, *n;
27
28 list_for_each_entry_safe(pos, n, &evlist->entries, node) {
29 list_del_init(&pos->node);
30 perf_evsel__delete(pos);
31 }
32
33 evlist->nr_entries = 0;
34 }
35
36 void perf_evlist__delete(struct perf_evlist *evlist)
37 {
38 perf_evlist__purge(evlist);
39 free(evlist->mmap);
40 free(evlist->pollfd);
41 free(evlist);
42 }
43
44 void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
45 {
46 list_add_tail(&entry->node, &evlist->entries);
47 ++evlist->nr_entries;
48 }
49
50 int perf_evlist__add_default(struct perf_evlist *evlist)
51 {
52 struct perf_event_attr attr = {
53 .type = PERF_TYPE_HARDWARE,
54 .config = PERF_COUNT_HW_CPU_CYCLES,
55 };
56 struct perf_evsel *evsel = perf_evsel__new(&attr, 0);
57
58 if (evsel == NULL)
59 return -ENOMEM;
60
61 perf_evlist__add(evlist, evsel);
62 return 0;
63 }
64
65 int perf_evlist__alloc_pollfd(struct perf_evlist *evlist, int ncpus, int nthreads)
66 {
67 int nfds = ncpus * nthreads * evlist->nr_entries;
68 evlist->pollfd = malloc(sizeof(struct pollfd) * nfds);
69 return evlist->pollfd != NULL ? 0 : -ENOMEM;
70 }
71
72 void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd)
73 {
74 fcntl(fd, F_SETFL, O_NONBLOCK);
75 evlist->pollfd[evlist->nr_fds].fd = fd;
76 evlist->pollfd[evlist->nr_fds].events = POLLIN;
77 evlist->nr_fds++;
78 }
79
80 struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id)
81 {
82 struct hlist_head *head;
83 struct hlist_node *pos;
84 struct perf_sample_id *sid;
85 int hash;
86
87 if (evlist->nr_entries == 1)
88 return list_entry(evlist->entries.next, struct perf_evsel, node);
89
90 hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
91 head = &evlist->heads[hash];
92
93 hlist_for_each_entry(sid, pos, head, node)
94 if (sid->id == id)
95 return sid->evsel;
96 return NULL;
97 }