]> Pileus Git - ~andy/linux/blob - tools/perf/util/evlist.c
b939221efd8dea0b670d1d968e7fa9086c7034a0
[~andy/linux] / tools / perf / util / evlist.c
1 /*
2  * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
3  *
4  * Parts came from builtin-{top,stat,record}.c, see those files for further
5  * copyright notes.
6  *
7  * Released under the GPL v2. (and only v2, not any later version)
8  */
9 #include "util.h"
10 #include <lk/debugfs.h>
11 #include <poll.h>
12 #include "cpumap.h"
13 #include "thread_map.h"
14 #include "target.h"
15 #include "evlist.h"
16 #include "evsel.h"
17 #include "debug.h"
18 #include <unistd.h>
19
20 #include "parse-events.h"
21 #include "parse-options.h"
22
23 #include <sys/mman.h>
24
25 #include <linux/bitops.h>
26 #include <linux/hash.h>
27
28 #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
29 #define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
30
31 void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus,
32                        struct thread_map *threads)
33 {
34         int i;
35
36         for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i)
37                 INIT_HLIST_HEAD(&evlist->heads[i]);
38         INIT_LIST_HEAD(&evlist->entries);
39         perf_evlist__set_maps(evlist, cpus, threads);
40         evlist->workload.pid = -1;
41 }
42
43 struct perf_evlist *perf_evlist__new(void)
44 {
45         struct perf_evlist *evlist = zalloc(sizeof(*evlist));
46
47         if (evlist != NULL)
48                 perf_evlist__init(evlist, NULL, NULL);
49
50         return evlist;
51 }
52
53 struct perf_evlist *perf_evlist__new_default(void)
54 {
55         struct perf_evlist *evlist = perf_evlist__new();
56
57         if (evlist && perf_evlist__add_default(evlist)) {
58                 perf_evlist__delete(evlist);
59                 evlist = NULL;
60         }
61
62         return evlist;
63 }
64
65 /**
66  * perf_evlist__set_id_pos - set the positions of event ids.
67  * @evlist: selected event list
68  *
69  * Events with compatible sample types all have the same id_pos
70  * and is_pos.  For convenience, put a copy on evlist.
71  */
72 void perf_evlist__set_id_pos(struct perf_evlist *evlist)
73 {
74         struct perf_evsel *first = perf_evlist__first(evlist);
75
76         evlist->id_pos = first->id_pos;
77         evlist->is_pos = first->is_pos;
78 }
79
80 static void perf_evlist__update_id_pos(struct perf_evlist *evlist)
81 {
82         struct perf_evsel *evsel;
83
84         list_for_each_entry(evsel, &evlist->entries, node)
85                 perf_evsel__calc_id_pos(evsel);
86
87         perf_evlist__set_id_pos(evlist);
88 }
89
90 static void perf_evlist__purge(struct perf_evlist *evlist)
91 {
92         struct perf_evsel *pos, *n;
93
94         list_for_each_entry_safe(pos, n, &evlist->entries, node) {
95                 list_del_init(&pos->node);
96                 perf_evsel__delete(pos);
97         }
98
99         evlist->nr_entries = 0;
100 }
101
102 void perf_evlist__exit(struct perf_evlist *evlist)
103 {
104         free(evlist->mmap);
105         free(evlist->pollfd);
106         evlist->mmap = NULL;
107         evlist->pollfd = NULL;
108 }
109
110 void perf_evlist__delete(struct perf_evlist *evlist)
111 {
112         perf_evlist__purge(evlist);
113         perf_evlist__exit(evlist);
114         free(evlist);
115 }
116
117 void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
118 {
119         list_add_tail(&entry->node, &evlist->entries);
120         if (!evlist->nr_entries++)
121                 perf_evlist__set_id_pos(evlist);
122 }
123
124 void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
125                                    struct list_head *list,
126                                    int nr_entries)
127 {
128         bool set_id_pos = !evlist->nr_entries;
129
130         list_splice_tail(list, &evlist->entries);
131         evlist->nr_entries += nr_entries;
132         if (set_id_pos)
133                 perf_evlist__set_id_pos(evlist);
134 }
135
136 void __perf_evlist__set_leader(struct list_head *list)
137 {
138         struct perf_evsel *evsel, *leader;
139
140         leader = list_entry(list->next, struct perf_evsel, node);
141         evsel = list_entry(list->prev, struct perf_evsel, node);
142
143         leader->nr_members = evsel->idx - leader->idx + 1;
144
145         list_for_each_entry(evsel, list, node) {
146                 evsel->leader = leader;
147         }
148 }
149
150 void perf_evlist__set_leader(struct perf_evlist *evlist)
151 {
152         if (evlist->nr_entries) {
153                 evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0;
154                 __perf_evlist__set_leader(&evlist->entries);
155         }
156 }
157
158 int perf_evlist__add_default(struct perf_evlist *evlist)
159 {
160         struct perf_event_attr attr = {
161                 .type = PERF_TYPE_HARDWARE,
162                 .config = PERF_COUNT_HW_CPU_CYCLES,
163         };
164         struct perf_evsel *evsel;
165
166         event_attr_init(&attr);
167
168         evsel = perf_evsel__new(&attr, 0);
169         if (evsel == NULL)
170                 goto error;
171
172         /* use strdup() because free(evsel) assumes name is allocated */
173         evsel->name = strdup("cycles");
174         if (!evsel->name)
175                 goto error_free;
176
177         perf_evlist__add(evlist, evsel);
178         return 0;
179 error_free:
180         perf_evsel__delete(evsel);
181 error:
182         return -ENOMEM;
183 }
184
185 static int perf_evlist__add_attrs(struct perf_evlist *evlist,
186                                   struct perf_event_attr *attrs, size_t nr_attrs)
187 {
188         struct perf_evsel *evsel, *n;
189         LIST_HEAD(head);
190         size_t i;
191
192         for (i = 0; i < nr_attrs; i++) {
193                 evsel = perf_evsel__new(attrs + i, evlist->nr_entries + i);
194                 if (evsel == NULL)
195                         goto out_delete_partial_list;
196                 list_add_tail(&evsel->node, &head);
197         }
198
199         perf_evlist__splice_list_tail(evlist, &head, nr_attrs);
200
201         return 0;
202
203 out_delete_partial_list:
204         list_for_each_entry_safe(evsel, n, &head, node)
205                 perf_evsel__delete(evsel);
206         return -1;
207 }
208
209 int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
210                                      struct perf_event_attr *attrs, size_t nr_attrs)
211 {
212         size_t i;
213
214         for (i = 0; i < nr_attrs; i++)
215                 event_attr_init(attrs + i);
216
217         return perf_evlist__add_attrs(evlist, attrs, nr_attrs);
218 }
219
220 struct perf_evsel *
221 perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id)
222 {
223         struct perf_evsel *evsel;
224
225         list_for_each_entry(evsel, &evlist->entries, node) {
226                 if (evsel->attr.type   == PERF_TYPE_TRACEPOINT &&
227                     (int)evsel->attr.config == id)
228                         return evsel;
229         }
230
231         return NULL;
232 }
233
234 struct perf_evsel *
235 perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
236                                      const char *name)
237 {
238         struct perf_evsel *evsel;
239
240         list_for_each_entry(evsel, &evlist->entries, node) {
241                 if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) &&
242                     (strcmp(evsel->name, name) == 0))
243                         return evsel;
244         }
245
246         return NULL;
247 }
248
249 int perf_evlist__add_newtp(struct perf_evlist *evlist,
250                            const char *sys, const char *name, void *handler)
251 {
252         struct perf_evsel *evsel;
253
254         evsel = perf_evsel__newtp(sys, name, evlist->nr_entries);
255         if (evsel == NULL)
256                 return -1;
257
258         evsel->handler = handler;
259         perf_evlist__add(evlist, evsel);
260         return 0;
261 }
262
263 void perf_evlist__disable(struct perf_evlist *evlist)
264 {
265         int cpu, thread;
266         struct perf_evsel *pos;
267         int nr_cpus = cpu_map__nr(evlist->cpus);
268         int nr_threads = thread_map__nr(evlist->threads);
269
270         for (cpu = 0; cpu < nr_cpus; cpu++) {
271                 list_for_each_entry(pos, &evlist->entries, node) {
272                         if (!perf_evsel__is_group_leader(pos) || !pos->fd)
273                                 continue;
274                         for (thread = 0; thread < nr_threads; thread++)
275                                 ioctl(FD(pos, cpu, thread),
276                                       PERF_EVENT_IOC_DISABLE, 0);
277                 }
278         }
279 }
280
281 void perf_evlist__enable(struct perf_evlist *evlist)
282 {
283         int cpu, thread;
284         struct perf_evsel *pos;
285         int nr_cpus = cpu_map__nr(evlist->cpus);
286         int nr_threads = thread_map__nr(evlist->threads);
287
288         for (cpu = 0; cpu < nr_cpus; cpu++) {
289                 list_for_each_entry(pos, &evlist->entries, node) {
290                         if (!perf_evsel__is_group_leader(pos) || !pos->fd)
291                                 continue;
292                         for (thread = 0; thread < nr_threads; thread++)
293                                 ioctl(FD(pos, cpu, thread),
294                                       PERF_EVENT_IOC_ENABLE, 0);
295                 }
296         }
297 }
298
299 int perf_evlist__disable_event(struct perf_evlist *evlist,
300                                struct perf_evsel *evsel)
301 {
302         int cpu, thread, err;
303
304         if (!evsel->fd)
305                 return 0;
306
307         for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
308                 for (thread = 0; thread < evlist->threads->nr; thread++) {
309                         err = ioctl(FD(evsel, cpu, thread),
310                                     PERF_EVENT_IOC_DISABLE, 0);
311                         if (err)
312                                 return err;
313                 }
314         }
315         return 0;
316 }
317
318 int perf_evlist__enable_event(struct perf_evlist *evlist,
319                               struct perf_evsel *evsel)
320 {
321         int cpu, thread, err;
322
323         if (!evsel->fd)
324                 return -EINVAL;
325
326         for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
327                 for (thread = 0; thread < evlist->threads->nr; thread++) {
328                         err = ioctl(FD(evsel, cpu, thread),
329                                     PERF_EVENT_IOC_ENABLE, 0);
330                         if (err)
331                                 return err;
332                 }
333         }
334         return 0;
335 }
336
337 static int perf_evlist__alloc_pollfd(struct perf_evlist *evlist)
338 {
339         int nr_cpus = cpu_map__nr(evlist->cpus);
340         int nr_threads = thread_map__nr(evlist->threads);
341         int nfds = nr_cpus * nr_threads * evlist->nr_entries;
342         evlist->pollfd = malloc(sizeof(struct pollfd) * nfds);
343         return evlist->pollfd != NULL ? 0 : -ENOMEM;
344 }
345
346 void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd)
347 {
348         fcntl(fd, F_SETFL, O_NONBLOCK);
349         evlist->pollfd[evlist->nr_fds].fd = fd;
350         evlist->pollfd[evlist->nr_fds].events = POLLIN;
351         evlist->nr_fds++;
352 }
353
354 static void perf_evlist__id_hash(struct perf_evlist *evlist,
355                                  struct perf_evsel *evsel,
356                                  int cpu, int thread, u64 id)
357 {
358         int hash;
359         struct perf_sample_id *sid = SID(evsel, cpu, thread);
360
361         sid->id = id;
362         sid->evsel = evsel;
363         hash = hash_64(sid->id, PERF_EVLIST__HLIST_BITS);
364         hlist_add_head(&sid->node, &evlist->heads[hash]);
365 }
366
367 void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
368                          int cpu, int thread, u64 id)
369 {
370         perf_evlist__id_hash(evlist, evsel, cpu, thread, id);
371         evsel->id[evsel->ids++] = id;
372 }
373
374 static int perf_evlist__id_add_fd(struct perf_evlist *evlist,
375                                   struct perf_evsel *evsel,
376                                   int cpu, int thread, int fd)
377 {
378         u64 read_data[4] = { 0, };
379         int id_idx = 1; /* The first entry is the counter value */
380         u64 id;
381         int ret;
382
383         ret = ioctl(fd, PERF_EVENT_IOC_ID, &id);
384         if (!ret)
385                 goto add;
386
387         if (errno != ENOTTY)
388                 return -1;
389
390         /* Legacy way to get event id.. All hail to old kernels! */
391
392         /*
393          * This way does not work with group format read, so bail
394          * out in that case.
395          */
396         if (perf_evlist__read_format(evlist) & PERF_FORMAT_GROUP)
397                 return -1;
398
399         if (!(evsel->attr.read_format & PERF_FORMAT_ID) ||
400             read(fd, &read_data, sizeof(read_data)) == -1)
401                 return -1;
402
403         if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
404                 ++id_idx;
405         if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
406                 ++id_idx;
407
408         id = read_data[id_idx];
409
410  add:
411         perf_evlist__id_add(evlist, evsel, cpu, thread, id);
412         return 0;
413 }
414
415 struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id)
416 {
417         struct hlist_head *head;
418         struct perf_sample_id *sid;
419         int hash;
420
421         hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
422         head = &evlist->heads[hash];
423
424         hlist_for_each_entry(sid, head, node)
425                 if (sid->id == id)
426                         return sid;
427
428         return NULL;
429 }
430
431 struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id)
432 {
433         struct perf_sample_id *sid;
434
435         if (evlist->nr_entries == 1)
436                 return perf_evlist__first(evlist);
437
438         sid = perf_evlist__id2sid(evlist, id);
439         if (sid)
440                 return sid->evsel;
441
442         if (!perf_evlist__sample_id_all(evlist))
443                 return perf_evlist__first(evlist);
444
445         return NULL;
446 }
447
448 static int perf_evlist__event2id(struct perf_evlist *evlist,
449                                  union perf_event *event, u64 *id)
450 {
451         const u64 *array = event->sample.array;
452         ssize_t n;
453
454         n = (event->header.size - sizeof(event->header)) >> 3;
455
456         if (event->header.type == PERF_RECORD_SAMPLE) {
457                 if (evlist->id_pos >= n)
458                         return -1;
459                 *id = array[evlist->id_pos];
460         } else {
461                 if (evlist->is_pos > n)
462                         return -1;
463                 n -= evlist->is_pos;
464                 *id = array[n];
465         }
466         return 0;
467 }
468
469 static struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist,
470                                                    union perf_event *event)
471 {
472         struct perf_evsel *first = perf_evlist__first(evlist);
473         struct hlist_head *head;
474         struct perf_sample_id *sid;
475         int hash;
476         u64 id;
477
478         if (evlist->nr_entries == 1)
479                 return first;
480
481         if (!first->attr.sample_id_all &&
482             event->header.type != PERF_RECORD_SAMPLE)
483                 return first;
484
485         if (perf_evlist__event2id(evlist, event, &id))
486                 return NULL;
487
488         /* Synthesized events have an id of zero */
489         if (!id)
490                 return first;
491
492         hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
493         head = &evlist->heads[hash];
494
495         hlist_for_each_entry(sid, head, node) {
496                 if (sid->id == id)
497                         return sid->evsel;
498         }
499         return NULL;
500 }
501
502 union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx)
503 {
504         struct perf_mmap *md = &evlist->mmap[idx];
505         unsigned int head = perf_mmap__read_head(md);
506         unsigned int old = md->prev;
507         unsigned char *data = md->base + page_size;
508         union perf_event *event = NULL;
509
510         if (evlist->overwrite) {
511                 /*
512                  * If we're further behind than half the buffer, there's a chance
513                  * the writer will bite our tail and mess up the samples under us.
514                  *
515                  * If we somehow ended up ahead of the head, we got messed up.
516                  *
517                  * In either case, truncate and restart at head.
518                  */
519                 int diff = head - old;
520                 if (diff > md->mask / 2 || diff < 0) {
521                         fprintf(stderr, "WARNING: failed to keep up with mmap data.\n");
522
523                         /*
524                          * head points to a known good entry, start there.
525                          */
526                         old = head;
527                 }
528         }
529
530         if (old != head) {
531                 size_t size;
532
533                 event = (union perf_event *)&data[old & md->mask];
534                 size = event->header.size;
535
536                 /*
537                  * Event straddles the mmap boundary -- header should always
538                  * be inside due to u64 alignment of output.
539                  */
540                 if ((old & md->mask) + size != ((old + size) & md->mask)) {
541                         unsigned int offset = old;
542                         unsigned int len = min(sizeof(*event), size), cpy;
543                         void *dst = md->event_copy;
544
545                         do {
546                                 cpy = min(md->mask + 1 - (offset & md->mask), len);
547                                 memcpy(dst, &data[offset & md->mask], cpy);
548                                 offset += cpy;
549                                 dst += cpy;
550                                 len -= cpy;
551                         } while (len);
552
553                         event = (union perf_event *) md->event_copy;
554                 }
555
556                 old += size;
557         }
558
559         md->prev = old;
560
561         return event;
562 }
563
564 void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx)
565 {
566         if (!evlist->overwrite) {
567                 struct perf_mmap *md = &evlist->mmap[idx];
568                 unsigned int old = md->prev;
569
570                 perf_mmap__write_tail(md, old);
571         }
572 }
573
574 static void __perf_evlist__munmap(struct perf_evlist *evlist, int idx)
575 {
576         if (evlist->mmap[idx].base != NULL) {
577                 munmap(evlist->mmap[idx].base, evlist->mmap_len);
578                 evlist->mmap[idx].base = NULL;
579         }
580 }
581
582 void perf_evlist__munmap(struct perf_evlist *evlist)
583 {
584         int i;
585
586         for (i = 0; i < evlist->nr_mmaps; i++)
587                 __perf_evlist__munmap(evlist, i);
588
589         free(evlist->mmap);
590         evlist->mmap = NULL;
591 }
592
593 static int perf_evlist__alloc_mmap(struct perf_evlist *evlist)
594 {
595         evlist->nr_mmaps = cpu_map__nr(evlist->cpus);
596         if (cpu_map__empty(evlist->cpus))
597                 evlist->nr_mmaps = thread_map__nr(evlist->threads);
598         evlist->mmap = zalloc(evlist->nr_mmaps * sizeof(struct perf_mmap));
599         return evlist->mmap != NULL ? 0 : -ENOMEM;
600 }
601
602 static int __perf_evlist__mmap(struct perf_evlist *evlist,
603                                int idx, int prot, int mask, int fd)
604 {
605         evlist->mmap[idx].prev = 0;
606         evlist->mmap[idx].mask = mask;
607         evlist->mmap[idx].base = mmap(NULL, evlist->mmap_len, prot,
608                                       MAP_SHARED, fd, 0);
609         if (evlist->mmap[idx].base == MAP_FAILED) {
610                 pr_debug2("failed to mmap perf event ring buffer, error %d\n",
611                           errno);
612                 evlist->mmap[idx].base = NULL;
613                 return -1;
614         }
615
616         perf_evlist__add_pollfd(evlist, fd);
617         return 0;
618 }
619
620 static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
621                                        int prot, int mask, int cpu, int thread,
622                                        int *output)
623 {
624         struct perf_evsel *evsel;
625
626         list_for_each_entry(evsel, &evlist->entries, node) {
627                 int fd = FD(evsel, cpu, thread);
628
629                 if (*output == -1) {
630                         *output = fd;
631                         if (__perf_evlist__mmap(evlist, idx, prot, mask,
632                                                 *output) < 0)
633                                 return -1;
634                 } else {
635                         if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, *output) != 0)
636                                 return -1;
637                 }
638
639                 if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
640                     perf_evlist__id_add_fd(evlist, evsel, cpu, thread, fd) < 0)
641                         return -1;
642         }
643
644         return 0;
645 }
646
647 static int perf_evlist__mmap_per_cpu(struct perf_evlist *evlist, int prot,
648                                      int mask)
649 {
650         int cpu, thread;
651         int nr_cpus = cpu_map__nr(evlist->cpus);
652         int nr_threads = thread_map__nr(evlist->threads);
653
654         pr_debug2("perf event ring buffer mmapped per cpu\n");
655         for (cpu = 0; cpu < nr_cpus; cpu++) {
656                 int output = -1;
657
658                 for (thread = 0; thread < nr_threads; thread++) {
659                         if (perf_evlist__mmap_per_evsel(evlist, cpu, prot, mask,
660                                                         cpu, thread, &output))
661                                 goto out_unmap;
662                 }
663         }
664
665         return 0;
666
667 out_unmap:
668         for (cpu = 0; cpu < nr_cpus; cpu++)
669                 __perf_evlist__munmap(evlist, cpu);
670         return -1;
671 }
672
673 static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist, int prot,
674                                         int mask)
675 {
676         int thread;
677         int nr_threads = thread_map__nr(evlist->threads);
678
679         pr_debug2("perf event ring buffer mmapped per thread\n");
680         for (thread = 0; thread < nr_threads; thread++) {
681                 int output = -1;
682
683                 if (perf_evlist__mmap_per_evsel(evlist, thread, prot, mask, 0,
684                                                 thread, &output))
685                         goto out_unmap;
686         }
687
688         return 0;
689
690 out_unmap:
691         for (thread = 0; thread < nr_threads; thread++)
692                 __perf_evlist__munmap(evlist, thread);
693         return -1;
694 }
695
696 static size_t perf_evlist__mmap_size(unsigned long pages)
697 {
698         /* 512 kiB: default amount of unprivileged mlocked memory */
699         if (pages == UINT_MAX)
700                 pages = (512 * 1024) / page_size;
701         else if (!is_power_of_2(pages))
702                 return 0;
703
704         return (pages + 1) * page_size;
705 }
706
707 int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str,
708                                   int unset __maybe_unused)
709 {
710         unsigned int *mmap_pages = opt->value;
711         unsigned long pages, val;
712         size_t size;
713         static struct parse_tag tags[] = {
714                 { .tag  = 'B', .mult = 1       },
715                 { .tag  = 'K', .mult = 1 << 10 },
716                 { .tag  = 'M', .mult = 1 << 20 },
717                 { .tag  = 'G', .mult = 1 << 30 },
718                 { .tag  = 0 },
719         };
720
721         val = parse_tag_value(str, tags);
722         if (val != (unsigned long) -1) {
723                 /* we got file size value */
724                 pages = PERF_ALIGN(val, page_size) / page_size;
725                 if (pages < (1UL << 31) && !is_power_of_2(pages)) {
726                         pages = next_pow2(pages);
727                         pr_info("rounding mmap pages size to %lu (%lu pages)\n",
728                                 pages * page_size, pages);
729                 }
730         } else {
731                 /* we got pages count value */
732                 char *eptr;
733                 pages = strtoul(str, &eptr, 10);
734                 if (*eptr != '\0') {
735                         pr_err("failed to parse --mmap_pages/-m value\n");
736                         return -1;
737                 }
738         }
739
740         if (pages > UINT_MAX || pages > SIZE_MAX / page_size) {
741                 pr_err("--mmap_pages/-m value too big\n");
742                 return -1;
743         }
744
745         size = perf_evlist__mmap_size(pages);
746         if (!size) {
747                 pr_err("--mmap_pages/-m value must be a power of two.");
748                 return -1;
749         }
750
751         *mmap_pages = pages;
752         return 0;
753 }
754
755 /**
756  * perf_evlist__mmap - Create mmaps to receive events.
757  * @evlist: list of events
758  * @pages: map length in pages
759  * @overwrite: overwrite older events?
760  *
761  * If @overwrite is %false the user needs to signal event consumption using
762  * perf_mmap__write_tail().  Using perf_evlist__mmap_read() does this
763  * automatically.
764  *
765  * Return: %0 on success, negative error code otherwise.
766  */
767 int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
768                       bool overwrite)
769 {
770         struct perf_evsel *evsel;
771         const struct cpu_map *cpus = evlist->cpus;
772         const struct thread_map *threads = evlist->threads;
773         int prot = PROT_READ | (overwrite ? 0 : PROT_WRITE), mask;
774
775         if (evlist->mmap == NULL && perf_evlist__alloc_mmap(evlist) < 0)
776                 return -ENOMEM;
777
778         if (evlist->pollfd == NULL && perf_evlist__alloc_pollfd(evlist) < 0)
779                 return -ENOMEM;
780
781         evlist->overwrite = overwrite;
782         evlist->mmap_len = perf_evlist__mmap_size(pages);
783         pr_debug("mmap size %zuB\n", evlist->mmap_len);
784         mask = evlist->mmap_len - page_size - 1;
785
786         list_for_each_entry(evsel, &evlist->entries, node) {
787                 if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
788                     evsel->sample_id == NULL &&
789                     perf_evsel__alloc_id(evsel, cpu_map__nr(cpus), threads->nr) < 0)
790                         return -ENOMEM;
791         }
792
793         if (cpu_map__empty(cpus))
794                 return perf_evlist__mmap_per_thread(evlist, prot, mask);
795
796         return perf_evlist__mmap_per_cpu(evlist, prot, mask);
797 }
798
799 int perf_evlist__create_maps(struct perf_evlist *evlist,
800                              struct perf_target *target)
801 {
802         evlist->threads = thread_map__new_str(target->pid, target->tid,
803                                               target->uid);
804
805         if (evlist->threads == NULL)
806                 return -1;
807
808         if (perf_target__has_task(target))
809                 evlist->cpus = cpu_map__dummy_new();
810         else if (!perf_target__has_cpu(target) && !target->uses_mmap)
811                 evlist->cpus = cpu_map__dummy_new();
812         else
813                 evlist->cpus = cpu_map__new(target->cpu_list);
814
815         if (evlist->cpus == NULL)
816                 goto out_delete_threads;
817
818         return 0;
819
820 out_delete_threads:
821         thread_map__delete(evlist->threads);
822         return -1;
823 }
824
825 void perf_evlist__delete_maps(struct perf_evlist *evlist)
826 {
827         cpu_map__delete(evlist->cpus);
828         thread_map__delete(evlist->threads);
829         evlist->cpus    = NULL;
830         evlist->threads = NULL;
831 }
832
833 int perf_evlist__apply_filters(struct perf_evlist *evlist)
834 {
835         struct perf_evsel *evsel;
836         int err = 0;
837         const int ncpus = cpu_map__nr(evlist->cpus),
838                   nthreads = thread_map__nr(evlist->threads);
839
840         list_for_each_entry(evsel, &evlist->entries, node) {
841                 if (evsel->filter == NULL)
842                         continue;
843
844                 err = perf_evsel__set_filter(evsel, ncpus, nthreads, evsel->filter);
845                 if (err)
846                         break;
847         }
848
849         return err;
850 }
851
852 int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter)
853 {
854         struct perf_evsel *evsel;
855         int err = 0;
856         const int ncpus = cpu_map__nr(evlist->cpus),
857                   nthreads = thread_map__nr(evlist->threads);
858
859         list_for_each_entry(evsel, &evlist->entries, node) {
860                 err = perf_evsel__set_filter(evsel, ncpus, nthreads, filter);
861                 if (err)
862                         break;
863         }
864
865         return err;
866 }
867
868 bool perf_evlist__valid_sample_type(struct perf_evlist *evlist)
869 {
870         struct perf_evsel *pos;
871
872         if (evlist->nr_entries == 1)
873                 return true;
874
875         if (evlist->id_pos < 0 || evlist->is_pos < 0)
876                 return false;
877
878         list_for_each_entry(pos, &evlist->entries, node) {
879                 if (pos->id_pos != evlist->id_pos ||
880                     pos->is_pos != evlist->is_pos)
881                         return false;
882         }
883
884         return true;
885 }
886
887 u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist)
888 {
889         struct perf_evsel *evsel;
890
891         if (evlist->combined_sample_type)
892                 return evlist->combined_sample_type;
893
894         list_for_each_entry(evsel, &evlist->entries, node)
895                 evlist->combined_sample_type |= evsel->attr.sample_type;
896
897         return evlist->combined_sample_type;
898 }
899
900 u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist)
901 {
902         evlist->combined_sample_type = 0;
903         return __perf_evlist__combined_sample_type(evlist);
904 }
905
906 bool perf_evlist__valid_read_format(struct perf_evlist *evlist)
907 {
908         struct perf_evsel *first = perf_evlist__first(evlist), *pos = first;
909         u64 read_format = first->attr.read_format;
910         u64 sample_type = first->attr.sample_type;
911
912         list_for_each_entry_continue(pos, &evlist->entries, node) {
913                 if (read_format != pos->attr.read_format)
914                         return false;
915         }
916
917         /* PERF_SAMPLE_READ imples PERF_FORMAT_ID. */
918         if ((sample_type & PERF_SAMPLE_READ) &&
919             !(read_format & PERF_FORMAT_ID)) {
920                 return false;
921         }
922
923         return true;
924 }
925
926 u64 perf_evlist__read_format(struct perf_evlist *evlist)
927 {
928         struct perf_evsel *first = perf_evlist__first(evlist);
929         return first->attr.read_format;
930 }
931
932 u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist)
933 {
934         struct perf_evsel *first = perf_evlist__first(evlist);
935         struct perf_sample *data;
936         u64 sample_type;
937         u16 size = 0;
938
939         if (!first->attr.sample_id_all)
940                 goto out;
941
942         sample_type = first->attr.sample_type;
943
944         if (sample_type & PERF_SAMPLE_TID)
945                 size += sizeof(data->tid) * 2;
946
947        if (sample_type & PERF_SAMPLE_TIME)
948                 size += sizeof(data->time);
949
950         if (sample_type & PERF_SAMPLE_ID)
951                 size += sizeof(data->id);
952
953         if (sample_type & PERF_SAMPLE_STREAM_ID)
954                 size += sizeof(data->stream_id);
955
956         if (sample_type & PERF_SAMPLE_CPU)
957                 size += sizeof(data->cpu) * 2;
958
959         if (sample_type & PERF_SAMPLE_IDENTIFIER)
960                 size += sizeof(data->id);
961 out:
962         return size;
963 }
964
965 bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist)
966 {
967         struct perf_evsel *first = perf_evlist__first(evlist), *pos = first;
968
969         list_for_each_entry_continue(pos, &evlist->entries, node) {
970                 if (first->attr.sample_id_all != pos->attr.sample_id_all)
971                         return false;
972         }
973
974         return true;
975 }
976
977 bool perf_evlist__sample_id_all(struct perf_evlist *evlist)
978 {
979         struct perf_evsel *first = perf_evlist__first(evlist);
980         return first->attr.sample_id_all;
981 }
982
983 void perf_evlist__set_selected(struct perf_evlist *evlist,
984                                struct perf_evsel *evsel)
985 {
986         evlist->selected = evsel;
987 }
988
989 void perf_evlist__close(struct perf_evlist *evlist)
990 {
991         struct perf_evsel *evsel;
992         int ncpus = cpu_map__nr(evlist->cpus);
993         int nthreads = thread_map__nr(evlist->threads);
994
995         list_for_each_entry_reverse(evsel, &evlist->entries, node)
996                 perf_evsel__close(evsel, ncpus, nthreads);
997 }
998
999 int perf_evlist__open(struct perf_evlist *evlist)
1000 {
1001         struct perf_evsel *evsel;
1002         int err;
1003
1004         perf_evlist__update_id_pos(evlist);
1005
1006         list_for_each_entry(evsel, &evlist->entries, node) {
1007                 err = perf_evsel__open(evsel, evlist->cpus, evlist->threads);
1008                 if (err < 0)
1009                         goto out_err;
1010         }
1011
1012         return 0;
1013 out_err:
1014         perf_evlist__close(evlist);
1015         errno = -err;
1016         return err;
1017 }
1018
1019 int perf_evlist__prepare_workload(struct perf_evlist *evlist,
1020                                   struct perf_target *target,
1021                                   const char *argv[], bool pipe_output,
1022                                   bool want_signal)
1023 {
1024         int child_ready_pipe[2], go_pipe[2];
1025         char bf;
1026
1027         if (pipe(child_ready_pipe) < 0) {
1028                 perror("failed to create 'ready' pipe");
1029                 return -1;
1030         }
1031
1032         if (pipe(go_pipe) < 0) {
1033                 perror("failed to create 'go' pipe");
1034                 goto out_close_ready_pipe;
1035         }
1036
1037         evlist->workload.pid = fork();
1038         if (evlist->workload.pid < 0) {
1039                 perror("failed to fork");
1040                 goto out_close_pipes;
1041         }
1042
1043         if (!evlist->workload.pid) {
1044                 if (pipe_output)
1045                         dup2(2, 1);
1046
1047                 signal(SIGTERM, SIG_DFL);
1048
1049                 close(child_ready_pipe[0]);
1050                 close(go_pipe[1]);
1051                 fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
1052
1053                 /*
1054                  * Tell the parent we're ready to go
1055                  */
1056                 close(child_ready_pipe[1]);
1057
1058                 /*
1059                  * Wait until the parent tells us to go.
1060                  */
1061                 if (read(go_pipe[0], &bf, 1) == -1)
1062                         perror("unable to read pipe");
1063
1064                 execvp(argv[0], (char **)argv);
1065
1066                 perror(argv[0]);
1067                 if (want_signal)
1068                         kill(getppid(), SIGUSR1);
1069                 exit(-1);
1070         }
1071
1072         if (perf_target__none(target))
1073                 evlist->threads->map[0] = evlist->workload.pid;
1074
1075         close(child_ready_pipe[1]);
1076         close(go_pipe[0]);
1077         /*
1078          * wait for child to settle
1079          */
1080         if (read(child_ready_pipe[0], &bf, 1) == -1) {
1081                 perror("unable to read pipe");
1082                 goto out_close_pipes;
1083         }
1084
1085         fcntl(go_pipe[1], F_SETFD, FD_CLOEXEC);
1086         evlist->workload.cork_fd = go_pipe[1];
1087         close(child_ready_pipe[0]);
1088         return 0;
1089
1090 out_close_pipes:
1091         close(go_pipe[0]);
1092         close(go_pipe[1]);
1093 out_close_ready_pipe:
1094         close(child_ready_pipe[0]);
1095         close(child_ready_pipe[1]);
1096         return -1;
1097 }
1098
1099 int perf_evlist__start_workload(struct perf_evlist *evlist)
1100 {
1101         if (evlist->workload.cork_fd > 0) {
1102                 char bf = 0;
1103                 int ret;
1104                 /*
1105                  * Remove the cork, let it rip!
1106                  */
1107                 ret = write(evlist->workload.cork_fd, &bf, 1);
1108                 if (ret < 0)
1109                         perror("enable to write to pipe");
1110
1111                 close(evlist->workload.cork_fd);
1112                 return ret;
1113         }
1114
1115         return 0;
1116 }
1117
1118 int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
1119                               struct perf_sample *sample)
1120 {
1121         struct perf_evsel *evsel = perf_evlist__event2evsel(evlist, event);
1122
1123         if (!evsel)
1124                 return -EFAULT;
1125         return perf_evsel__parse_sample(evsel, event, sample);
1126 }
1127
1128 size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
1129 {
1130         struct perf_evsel *evsel;
1131         size_t printed = 0;
1132
1133         list_for_each_entry(evsel, &evlist->entries, node) {
1134                 printed += fprintf(fp, "%s%s", evsel->idx ? ", " : "",
1135                                    perf_evsel__name(evsel));
1136         }
1137
1138         return printed + fprintf(fp, "\n");;
1139 }
1140
1141 int perf_evlist__strerror_tp(struct perf_evlist *evlist __maybe_unused,
1142                              int err, char *buf, size_t size)
1143 {
1144         char sbuf[128];
1145
1146         switch (err) {
1147         case ENOENT:
1148                 scnprintf(buf, size, "%s",
1149                           "Error:\tUnable to find debugfs\n"
1150                           "Hint:\tWas your kernel was compiled with debugfs support?\n"
1151                           "Hint:\tIs the debugfs filesystem mounted?\n"
1152                           "Hint:\tTry 'sudo mount -t debugfs nodev /sys/kernel/debug'");
1153                 break;
1154         case EACCES:
1155                 scnprintf(buf, size,
1156                           "Error:\tNo permissions to read %s/tracing/events/raw_syscalls\n"
1157                           "Hint:\tTry 'sudo mount -o remount,mode=755 %s'\n",
1158                           debugfs_mountpoint, debugfs_mountpoint);
1159                 break;
1160         default:
1161                 scnprintf(buf, size, "%s", strerror_r(err, sbuf, sizeof(sbuf)));
1162                 break;
1163         }
1164
1165         return 0;
1166 }
1167
1168 int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused,
1169                                int err, char *buf, size_t size)
1170 {
1171         int printed, value;
1172         char sbuf[128], *emsg = strerror_r(err, sbuf, sizeof(sbuf));
1173
1174         switch (err) {
1175         case EACCES:
1176         case EPERM:
1177                 printed = scnprintf(buf, size,
1178                                     "Error:\t%s.\n"
1179                                     "Hint:\tCheck /proc/sys/kernel/perf_event_paranoid setting.", emsg);
1180
1181                 if (filename__read_int("/proc/sys/kernel/perf_event_paranoid", &value))
1182                         break;
1183
1184                 printed += scnprintf(buf + printed, size - printed, "\nHint:\t");
1185
1186                 if (value >= 2) {
1187                         printed += scnprintf(buf + printed, size - printed,
1188                                              "For your workloads it needs to be <= 1\nHint:\t");
1189                 }
1190                 printed += scnprintf(buf + printed, size - printed,
1191                                      "For system wide tracing it needs to be set to -1");
1192
1193                 printed += scnprintf(buf + printed, size - printed,
1194                                     ".\nHint:\tThe current value is %d.", value);
1195                 break;
1196         default:
1197                 scnprintf(buf, size, "%s", emsg);
1198                 break;
1199         }
1200
1201         return 0;
1202 }