1
2
3
4
5
6
7
8
9#include <byteswap.h>
10#include <errno.h>
11#include <inttypes.h>
12#include <linux/bitops.h>
13#include <api/fs/fs.h>
14#include <api/fs/tracing_path.h>
15#include <traceevent/event-parse.h>
16#include <linux/hw_breakpoint.h>
17#include <linux/perf_event.h>
18#include <linux/compiler.h>
19#include <linux/err.h>
20#include <linux/zalloc.h>
21#include <sys/ioctl.h>
22#include <sys/resource.h>
23#include <sys/types.h>
24#include <dirent.h>
25#include <stdlib.h>
26#include <perf/evsel.h>
27#include "asm/bug.h"
28#include "callchain.h"
29#include "cgroup.h"
30#include "counts.h"
31#include "event.h"
32#include "evsel.h"
33#include "util/env.h"
34#include "util/evsel_config.h"
35#include "util/evsel_fprintf.h"
36#include "evlist.h"
37#include <perf/cpumap.h>
38#include "thread_map.h"
39#include "target.h"
40#include "perf_regs.h"
41#include "record.h"
42#include "debug.h"
43#include "trace-event.h"
44#include "stat.h"
45#include "string2.h"
46#include "memswap.h"
47#include "util.h"
48#include "../perf-sys.h"
49#include "util/parse-branch-options.h"
50#include <internal/xyarray.h>
51#include <internal/lib.h>
52
53#include <linux/ctype.h>
54
55struct perf_missing_features perf_missing_features;
56
57static clockid_t clockid;
58
59static int evsel__no_extra_init(struct evsel *evsel __maybe_unused)
60{
61 return 0;
62}
63
64void __weak test_attr__ready(void) { }
65
66static void evsel__no_extra_fini(struct evsel *evsel __maybe_unused)
67{
68}
69
70static struct {
71 size_t size;
72 int (*init)(struct evsel *evsel);
73 void (*fini)(struct evsel *evsel);
74} perf_evsel__object = {
75 .size = sizeof(struct evsel),
76 .init = evsel__no_extra_init,
77 .fini = evsel__no_extra_fini,
78};
79
80int evsel__object_config(size_t object_size, int (*init)(struct evsel *evsel),
81 void (*fini)(struct evsel *evsel))
82{
83
84 if (object_size == 0)
85 goto set_methods;
86
87 if (perf_evsel__object.size > object_size)
88 return -EINVAL;
89
90 perf_evsel__object.size = object_size;
91
92set_methods:
93 if (init != NULL)
94 perf_evsel__object.init = init;
95
96 if (fini != NULL)
97 perf_evsel__object.fini = fini;
98
99 return 0;
100}
101
102#define FD(e, x, y) (*(int *)xyarray__entry(e->core.fd, x, y))
103
104int __evsel__sample_size(u64 sample_type)
105{
106 u64 mask = sample_type & PERF_SAMPLE_MASK;
107 int size = 0;
108 int i;
109
110 for (i = 0; i < 64; i++) {
111 if (mask & (1ULL << i))
112 size++;
113 }
114
115 size *= sizeof(u64);
116
117 return size;
118}
119
120
121
122
123
124
125
126
127
128static int __perf_evsel__calc_id_pos(u64 sample_type)
129{
130 int idx = 0;
131
132 if (sample_type & PERF_SAMPLE_IDENTIFIER)
133 return 0;
134
135 if (!(sample_type & PERF_SAMPLE_ID))
136 return -1;
137
138 if (sample_type & PERF_SAMPLE_IP)
139 idx += 1;
140
141 if (sample_type & PERF_SAMPLE_TID)
142 idx += 1;
143
144 if (sample_type & PERF_SAMPLE_TIME)
145 idx += 1;
146
147 if (sample_type & PERF_SAMPLE_ADDR)
148 idx += 1;
149
150 return idx;
151}
152
153
154
155
156
157
158
159
160
161static int __perf_evsel__calc_is_pos(u64 sample_type)
162{
163 int idx = 1;
164
165 if (sample_type & PERF_SAMPLE_IDENTIFIER)
166 return 1;
167
168 if (!(sample_type & PERF_SAMPLE_ID))
169 return -1;
170
171 if (sample_type & PERF_SAMPLE_CPU)
172 idx += 1;
173
174 if (sample_type & PERF_SAMPLE_STREAM_ID)
175 idx += 1;
176
177 return idx;
178}
179
180void evsel__calc_id_pos(struct evsel *evsel)
181{
182 evsel->id_pos = __perf_evsel__calc_id_pos(evsel->core.attr.sample_type);
183 evsel->is_pos = __perf_evsel__calc_is_pos(evsel->core.attr.sample_type);
184}
185
186void __evsel__set_sample_bit(struct evsel *evsel,
187 enum perf_event_sample_format bit)
188{
189 if (!(evsel->core.attr.sample_type & bit)) {
190 evsel->core.attr.sample_type |= bit;
191 evsel->sample_size += sizeof(u64);
192 evsel__calc_id_pos(evsel);
193 }
194}
195
196void __evsel__reset_sample_bit(struct evsel *evsel,
197 enum perf_event_sample_format bit)
198{
199 if (evsel->core.attr.sample_type & bit) {
200 evsel->core.attr.sample_type &= ~bit;
201 evsel->sample_size -= sizeof(u64);
202 evsel__calc_id_pos(evsel);
203 }
204}
205
206void evsel__set_sample_id(struct evsel *evsel,
207 bool can_sample_identifier)
208{
209 if (can_sample_identifier) {
210 evsel__reset_sample_bit(evsel, ID);
211 evsel__set_sample_bit(evsel, IDENTIFIER);
212 } else {
213 evsel__set_sample_bit(evsel, ID);
214 }
215 evsel->core.attr.read_format |= PERF_FORMAT_ID;
216}
217
218
219
220
221
222
223
224
225
226bool evsel__is_function_event(struct evsel *evsel)
227{
228#define FUNCTION_EVENT "ftrace:function"
229
230 return evsel->name &&
231 !strncmp(FUNCTION_EVENT, evsel->name, sizeof(FUNCTION_EVENT));
232
233#undef FUNCTION_EVENT
234}
235
236void evsel__init(struct evsel *evsel,
237 struct perf_event_attr *attr, int idx)
238{
239 perf_evsel__init(&evsel->core, attr);
240 evsel->idx = idx;
241 evsel->tracking = !idx;
242 evsel->leader = evsel;
243 evsel->unit = "";
244 evsel->scale = 1.0;
245 evsel->max_events = ULONG_MAX;
246 evsel->evlist = NULL;
247 evsel->bpf_obj = NULL;
248 evsel->bpf_fd = -1;
249 INIT_LIST_HEAD(&evsel->config_terms);
250 perf_evsel__object.init(evsel);
251 evsel->sample_size = __evsel__sample_size(attr->sample_type);
252 evsel__calc_id_pos(evsel);
253 evsel->cmdline_group_boundary = false;
254 evsel->metric_expr = NULL;
255 evsel->metric_name = NULL;
256 evsel->metric_events = NULL;
257 evsel->per_pkg_mask = NULL;
258 evsel->collect_stat = false;
259 evsel->pmu_name = NULL;
260}
261
262struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx)
263{
264 struct evsel *evsel = zalloc(perf_evsel__object.size);
265
266 if (!evsel)
267 return NULL;
268 evsel__init(evsel, attr, idx);
269
270 if (evsel__is_bpf_output(evsel)) {
271 evsel->core.attr.sample_type |= (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME |
272 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD),
273 evsel->core.attr.sample_period = 1;
274 }
275
276 if (evsel__is_clock(evsel)) {
277
278
279
280
281 static const char *unit = "msec";
282
283 evsel->unit = unit;
284 evsel->scale = 1e-6;
285 }
286
287 return evsel;
288}
289
290static bool perf_event_can_profile_kernel(void)
291{
292 return perf_event_paranoid_check(1);
293}
294
295struct evsel *evsel__new_cycles(bool precise)
296{
297 struct perf_event_attr attr = {
298 .type = PERF_TYPE_HARDWARE,
299 .config = PERF_COUNT_HW_CPU_CYCLES,
300 .exclude_kernel = !perf_event_can_profile_kernel(),
301 };
302 struct evsel *evsel;
303
304 event_attr_init(&attr);
305
306 if (!precise)
307 goto new_event;
308
309
310
311
312
313new_event:
314 evsel = evsel__new(&attr);
315 if (evsel == NULL)
316 goto out;
317
318 evsel->precise_max = true;
319
320
321 if (asprintf(&evsel->name, "cycles%s%s%.*s",
322 (attr.precise_ip || attr.exclude_kernel) ? ":" : "",
323 attr.exclude_kernel ? "u" : "",
324 attr.precise_ip ? attr.precise_ip + 1 : 0, "ppp") < 0)
325 goto error_free;
326out:
327 return evsel;
328error_free:
329 evsel__delete(evsel);
330 evsel = NULL;
331 goto out;
332}
333
334static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src)
335{
336 struct evsel_config_term *pos, *tmp;
337
338 list_for_each_entry(pos, &src->config_terms, list) {
339 tmp = malloc(sizeof(*tmp));
340 if (tmp == NULL)
341 return -ENOMEM;
342
343 *tmp = *pos;
344 if (tmp->free_str) {
345 tmp->val.str = strdup(pos->val.str);
346 if (tmp->val.str == NULL) {
347 free(tmp);
348 return -ENOMEM;
349 }
350 }
351 list_add_tail(&tmp->list, &dst->config_terms);
352 }
353 return 0;
354}
355
356
357
358
359
360
361
362
363struct evsel *evsel__clone(struct evsel *orig)
364{
365 struct evsel *evsel;
366
367 BUG_ON(orig->core.fd);
368 BUG_ON(orig->counts);
369 BUG_ON(orig->priv);
370 BUG_ON(orig->per_pkg_mask);
371
372
373 if (orig->bpf_obj)
374 return NULL;
375
376 evsel = evsel__new(&orig->core.attr);
377 if (evsel == NULL)
378 return NULL;
379
380 evsel->core.cpus = perf_cpu_map__get(orig->core.cpus);
381 evsel->core.own_cpus = perf_cpu_map__get(orig->core.own_cpus);
382 evsel->core.threads = perf_thread_map__get(orig->core.threads);
383 evsel->core.nr_members = orig->core.nr_members;
384 evsel->core.system_wide = orig->core.system_wide;
385
386 if (orig->name) {
387 evsel->name = strdup(orig->name);
388 if (evsel->name == NULL)
389 goto out_err;
390 }
391 if (orig->group_name) {
392 evsel->group_name = strdup(orig->group_name);
393 if (evsel->group_name == NULL)
394 goto out_err;
395 }
396 if (orig->pmu_name) {
397 evsel->pmu_name = strdup(orig->pmu_name);
398 if (evsel->pmu_name == NULL)
399 goto out_err;
400 }
401 if (orig->filter) {
402 evsel->filter = strdup(orig->filter);
403 if (evsel->filter == NULL)
404 goto out_err;
405 }
406 evsel->cgrp = cgroup__get(orig->cgrp);
407 evsel->tp_format = orig->tp_format;
408 evsel->handler = orig->handler;
409 evsel->leader = orig->leader;
410
411 evsel->max_events = orig->max_events;
412 evsel->tool_event = orig->tool_event;
413 evsel->unit = orig->unit;
414 evsel->scale = orig->scale;
415 evsel->snapshot = orig->snapshot;
416 evsel->per_pkg = orig->per_pkg;
417 evsel->percore = orig->percore;
418 evsel->precise_max = orig->precise_max;
419 evsel->use_uncore_alias = orig->use_uncore_alias;
420 evsel->is_libpfm_event = orig->is_libpfm_event;
421
422 evsel->exclude_GH = orig->exclude_GH;
423 evsel->sample_read = orig->sample_read;
424 evsel->auto_merge_stats = orig->auto_merge_stats;
425 evsel->collect_stat = orig->collect_stat;
426 evsel->weak_group = orig->weak_group;
427
428 if (evsel__copy_config_terms(evsel, orig) < 0)
429 goto out_err;
430
431 return evsel;
432
433out_err:
434 evsel__delete(evsel);
435 return NULL;
436}
437
438
439
440
441struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
442{
443 struct evsel *evsel = zalloc(perf_evsel__object.size);
444 int err = -ENOMEM;
445
446 if (evsel == NULL) {
447 goto out_err;
448 } else {
449 struct perf_event_attr attr = {
450 .type = PERF_TYPE_TRACEPOINT,
451 .sample_type = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME |
452 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD),
453 };
454
455 if (asprintf(&evsel->name, "%s:%s", sys, name) < 0)
456 goto out_free;
457
458 evsel->tp_format = trace_event__tp_format(sys, name);
459 if (IS_ERR(evsel->tp_format)) {
460 err = PTR_ERR(evsel->tp_format);
461 goto out_free;
462 }
463
464 event_attr_init(&attr);
465 attr.config = evsel->tp_format->id;
466 attr.sample_period = 1;
467 evsel__init(evsel, &attr, idx);
468 }
469
470 return evsel;
471
472out_free:
473 zfree(&evsel->name);
474 free(evsel);
475out_err:
476 return ERR_PTR(err);
477}
478
479const char *evsel__hw_names[PERF_COUNT_HW_MAX] = {
480 "cycles",
481 "instructions",
482 "cache-references",
483 "cache-misses",
484 "branches",
485 "branch-misses",
486 "bus-cycles",
487 "stalled-cycles-frontend",
488 "stalled-cycles-backend",
489 "ref-cycles",
490};
491
492static const char *__evsel__hw_name(u64 config)
493{
494 if (config < PERF_COUNT_HW_MAX && evsel__hw_names[config])
495 return evsel__hw_names[config];
496
497 return "unknown-hardware";
498}
499
500static int perf_evsel__add_modifiers(struct evsel *evsel, char *bf, size_t size)
501{
502 int colon = 0, r = 0;
503 struct perf_event_attr *attr = &evsel->core.attr;
504 bool exclude_guest_default = false;
505
506#define MOD_PRINT(context, mod) do { \
507 if (!attr->exclude_##context) { \
508 if (!colon) colon = ++r; \
509 r += scnprintf(bf + r, size - r, "%c", mod); \
510 } } while(0)
511
512 if (attr->exclude_kernel || attr->exclude_user || attr->exclude_hv) {
513 MOD_PRINT(kernel, 'k');
514 MOD_PRINT(user, 'u');
515 MOD_PRINT(hv, 'h');
516 exclude_guest_default = true;
517 }
518
519 if (attr->precise_ip) {
520 if (!colon)
521 colon = ++r;
522 r += scnprintf(bf + r, size - r, "%.*s", attr->precise_ip, "ppp");
523 exclude_guest_default = true;
524 }
525
526 if (attr->exclude_host || attr->exclude_guest == exclude_guest_default) {
527 MOD_PRINT(host, 'H');
528 MOD_PRINT(guest, 'G');
529 }
530#undef MOD_PRINT
531 if (colon)
532 bf[colon - 1] = ':';
533 return r;
534}
535
536static int evsel__hw_name(struct evsel *evsel, char *bf, size_t size)
537{
538 int r = scnprintf(bf, size, "%s", __evsel__hw_name(evsel->core.attr.config));
539 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r);
540}
541
542const char *evsel__sw_names[PERF_COUNT_SW_MAX] = {
543 "cpu-clock",
544 "task-clock",
545 "page-faults",
546 "context-switches",
547 "cpu-migrations",
548 "minor-faults",
549 "major-faults",
550 "alignment-faults",
551 "emulation-faults",
552 "dummy",
553};
554
555static const char *__evsel__sw_name(u64 config)
556{
557 if (config < PERF_COUNT_SW_MAX && evsel__sw_names[config])
558 return evsel__sw_names[config];
559 return "unknown-software";
560}
561
562static int evsel__sw_name(struct evsel *evsel, char *bf, size_t size)
563{
564 int r = scnprintf(bf, size, "%s", __evsel__sw_name(evsel->core.attr.config));
565 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r);
566}
567
568static int __evsel__bp_name(char *bf, size_t size, u64 addr, u64 type)
569{
570 int r;
571
572 r = scnprintf(bf, size, "mem:0x%" PRIx64 ":", addr);
573
574 if (type & HW_BREAKPOINT_R)
575 r += scnprintf(bf + r, size - r, "r");
576
577 if (type & HW_BREAKPOINT_W)
578 r += scnprintf(bf + r, size - r, "w");
579
580 if (type & HW_BREAKPOINT_X)
581 r += scnprintf(bf + r, size - r, "x");
582
583 return r;
584}
585
586static int evsel__bp_name(struct evsel *evsel, char *bf, size_t size)
587{
588 struct perf_event_attr *attr = &evsel->core.attr;
589 int r = __evsel__bp_name(bf, size, attr->bp_addr, attr->bp_type);
590 return r + perf_evsel__add_modifiers(evsel, bf + r, size - r);
591}
592
593const char *evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX][EVSEL__MAX_ALIASES] = {
594 { "L1-dcache", "l1-d", "l1d", "L1-data", },
595 { "L1-icache", "l1-i", "l1i", "L1-instruction", },
596 { "LLC", "L2", },
597 { "dTLB", "d-tlb", "Data-TLB", },
598 { "iTLB", "i-tlb", "Instruction-TLB", },
599 { "branch", "branches", "bpu", "btb", "bpc", },
600 { "node", },
601};
602
603const char *evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX][EVSEL__MAX_ALIASES] = {
604 { "load", "loads", "read", },
605 { "store", "stores", "write", },
606 { "prefetch", "prefetches", "speculative-read", "speculative-load", },
607};
608
609const char *evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX][EVSEL__MAX_ALIASES] = {
610 { "refs", "Reference", "ops", "access", },
611 { "misses", "miss", },
612};
613
614#define C(x) PERF_COUNT_HW_CACHE_##x
615#define CACHE_READ (1 << C(OP_READ))
616#define CACHE_WRITE (1 << C(OP_WRITE))
617#define CACHE_PREFETCH (1 << C(OP_PREFETCH))
618#define COP(x) (1 << x)
619
620
621
622
623
624
625static unsigned long evsel__hw_cache_stat[C(MAX)] = {
626 [C(L1D)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
627 [C(L1I)] = (CACHE_READ | CACHE_PREFETCH),
628 [C(LL)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
629 [C(DTLB)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
630 [C(ITLB)] = (CACHE_READ),
631 [C(BPU)] = (CACHE_READ),
632 [C(NODE)] = (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
633};
634
635bool evsel__is_cache_op_valid(u8 type, u8 op)
636{
637 if (evsel__hw_cache_stat[type] & COP(op))
638 return true;
639 else
640 return false;
641}
642
643int __evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, char *bf, size_t size)
644{
645 if (result) {
646 return scnprintf(bf, size, "%s-%s-%s", evsel__hw_cache[type][0],
647 evsel__hw_cache_op[op][0],
648 evsel__hw_cache_result[result][0]);
649 }
650
651 return scnprintf(bf, size, "%s-%s", evsel__hw_cache[type][0],
652 evsel__hw_cache_op[op][1]);
653}
654
655static int __evsel__hw_cache_name(u64 config, char *bf, size_t size)
656{
657 u8 op, result, type = (config >> 0) & 0xff;
658 const char *err = "unknown-ext-hardware-cache-type";
659
660 if (type >= PERF_COUNT_HW_CACHE_MAX)
661 goto out_err;
662
663 op = (config >> 8) & 0xff;
664 err = "unknown-ext-hardware-cache-op";
665 if (op >= PERF_COUNT_HW_CACHE_OP_MAX)
666 goto out_err;
667
668 result = (config >> 16) & 0xff;
669 err = "unknown-ext-hardware-cache-result";
670 if (result >= PERF_COUNT_HW_CACHE_RESULT_MAX)
671 goto out_err;
672
673 err = "invalid-cache";
674 if (!evsel__is_cache_op_valid(type, op))
675 goto out_err;
676
677 return __evsel__hw_cache_type_op_res_name(type, op, result, bf, size);
678out_err:
679 return scnprintf(bf, size, "%s", err);
680}
681
682static int evsel__hw_cache_name(struct evsel *evsel, char *bf, size_t size)
683{
684 int ret = __evsel__hw_cache_name(evsel->core.attr.config, bf, size);
685 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret);
686}
687
688static int evsel__raw_name(struct evsel *evsel, char *bf, size_t size)
689{
690 int ret = scnprintf(bf, size, "raw 0x%" PRIx64, evsel->core.attr.config);
691 return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret);
692}
693
694static int evsel__tool_name(char *bf, size_t size)
695{
696 int ret = scnprintf(bf, size, "duration_time");
697 return ret;
698}
699
700const char *evsel__name(struct evsel *evsel)
701{
702 char bf[128];
703
704 if (!evsel)
705 goto out_unknown;
706
707 if (evsel->name)
708 return evsel->name;
709
710 switch (evsel->core.attr.type) {
711 case PERF_TYPE_RAW:
712 evsel__raw_name(evsel, bf, sizeof(bf));
713 break;
714
715 case PERF_TYPE_HARDWARE:
716 evsel__hw_name(evsel, bf, sizeof(bf));
717 break;
718
719 case PERF_TYPE_HW_CACHE:
720 evsel__hw_cache_name(evsel, bf, sizeof(bf));
721 break;
722
723 case PERF_TYPE_SOFTWARE:
724 if (evsel->tool_event)
725 evsel__tool_name(bf, sizeof(bf));
726 else
727 evsel__sw_name(evsel, bf, sizeof(bf));
728 break;
729
730 case PERF_TYPE_TRACEPOINT:
731 scnprintf(bf, sizeof(bf), "%s", "unknown tracepoint");
732 break;
733
734 case PERF_TYPE_BREAKPOINT:
735 evsel__bp_name(evsel, bf, sizeof(bf));
736 break;
737
738 default:
739 scnprintf(bf, sizeof(bf), "unknown attr type: %d",
740 evsel->core.attr.type);
741 break;
742 }
743
744 evsel->name = strdup(bf);
745
746 if (evsel->name)
747 return evsel->name;
748out_unknown:
749 return "unknown";
750}
751
752const char *evsel__group_name(struct evsel *evsel)
753{
754 return evsel->group_name ?: "anon group";
755}
756
757
758
759
760
761
762
763
764
765
766
767int evsel__group_desc(struct evsel *evsel, char *buf, size_t size)
768{
769 int ret = 0;
770 struct evsel *pos;
771 const char *group_name = evsel__group_name(evsel);
772
773 if (!evsel->forced_leader)
774 ret = scnprintf(buf, size, "%s { ", group_name);
775
776 ret += scnprintf(buf + ret, size - ret, "%s", evsel__name(evsel));
777
778 for_each_group_member(pos, evsel)
779 ret += scnprintf(buf + ret, size - ret, ", %s", evsel__name(pos));
780
781 if (!evsel->forced_leader)
782 ret += scnprintf(buf + ret, size - ret, " }");
783
784 return ret;
785}
786
787static void __evsel__config_callchain(struct evsel *evsel, struct record_opts *opts,
788 struct callchain_param *param)
789{
790 bool function = evsel__is_function_event(evsel);
791 struct perf_event_attr *attr = &evsel->core.attr;
792
793 evsel__set_sample_bit(evsel, CALLCHAIN);
794
795 attr->sample_max_stack = param->max_stack;
796
797 if (opts->kernel_callchains)
798 attr->exclude_callchain_user = 1;
799 if (opts->user_callchains)
800 attr->exclude_callchain_kernel = 1;
801 if (param->record_mode == CALLCHAIN_LBR) {
802 if (!opts->branch_stack) {
803 if (attr->exclude_user) {
804 pr_warning("LBR callstack option is only available "
805 "to get user callchain information. "
806 "Falling back to framepointers.\n");
807 } else {
808 evsel__set_sample_bit(evsel, BRANCH_STACK);
809 attr->branch_sample_type = PERF_SAMPLE_BRANCH_USER |
810 PERF_SAMPLE_BRANCH_CALL_STACK |
811 PERF_SAMPLE_BRANCH_NO_CYCLES |
812 PERF_SAMPLE_BRANCH_NO_FLAGS |
813 PERF_SAMPLE_BRANCH_HW_INDEX;
814 }
815 } else
816 pr_warning("Cannot use LBR callstack with branch stack. "
817 "Falling back to framepointers.\n");
818 }
819
820 if (param->record_mode == CALLCHAIN_DWARF) {
821 if (!function) {
822 evsel__set_sample_bit(evsel, REGS_USER);
823 evsel__set_sample_bit(evsel, STACK_USER);
824 if (opts->sample_user_regs && DWARF_MINIMAL_REGS != PERF_REGS_MASK) {
825 attr->sample_regs_user |= DWARF_MINIMAL_REGS;
826 pr_warning("WARNING: The use of --call-graph=dwarf may require all the user registers, "
827 "specifying a subset with --user-regs may render DWARF unwinding unreliable, "
828 "so the minimal registers set (IP, SP) is explicitly forced.\n");
829 } else {
830 attr->sample_regs_user |= PERF_REGS_MASK;
831 }
832 attr->sample_stack_user = param->dump_size;
833 attr->exclude_callchain_user = 1;
834 } else {
835 pr_info("Cannot use DWARF unwind for function trace event,"
836 " falling back to framepointers.\n");
837 }
838 }
839
840 if (function) {
841 pr_info("Disabling user space callchains for function trace event.\n");
842 attr->exclude_callchain_user = 1;
843 }
844}
845
846void evsel__config_callchain(struct evsel *evsel, struct record_opts *opts,
847 struct callchain_param *param)
848{
849 if (param->enabled)
850 return __evsel__config_callchain(evsel, opts, param);
851}
852
853static void
854perf_evsel__reset_callgraph(struct evsel *evsel,
855 struct callchain_param *param)
856{
857 struct perf_event_attr *attr = &evsel->core.attr;
858
859 evsel__reset_sample_bit(evsel, CALLCHAIN);
860 if (param->record_mode == CALLCHAIN_LBR) {
861 evsel__reset_sample_bit(evsel, BRANCH_STACK);
862 attr->branch_sample_type &= ~(PERF_SAMPLE_BRANCH_USER |
863 PERF_SAMPLE_BRANCH_CALL_STACK |
864 PERF_SAMPLE_BRANCH_HW_INDEX);
865 }
866 if (param->record_mode == CALLCHAIN_DWARF) {
867 evsel__reset_sample_bit(evsel, REGS_USER);
868 evsel__reset_sample_bit(evsel, STACK_USER);
869 }
870}
871
872static void evsel__apply_config_terms(struct evsel *evsel,
873 struct record_opts *opts, bool track)
874{
875 struct evsel_config_term *term;
876 struct list_head *config_terms = &evsel->config_terms;
877 struct perf_event_attr *attr = &evsel->core.attr;
878
879 struct callchain_param param = {
880 .record_mode = callchain_param.record_mode,
881 };
882 u32 dump_size = 0;
883 int max_stack = 0;
884 const char *callgraph_buf = NULL;
885
886 list_for_each_entry(term, config_terms, list) {
887 switch (term->type) {
888 case EVSEL__CONFIG_TERM_PERIOD:
889 if (!(term->weak && opts->user_interval != ULLONG_MAX)) {
890 attr->sample_period = term->val.period;
891 attr->freq = 0;
892 evsel__reset_sample_bit(evsel, PERIOD);
893 }
894 break;
895 case EVSEL__CONFIG_TERM_FREQ:
896 if (!(term->weak && opts->user_freq != UINT_MAX)) {
897 attr->sample_freq = term->val.freq;
898 attr->freq = 1;
899 evsel__set_sample_bit(evsel, PERIOD);
900 }
901 break;
902 case EVSEL__CONFIG_TERM_TIME:
903 if (term->val.time)
904 evsel__set_sample_bit(evsel, TIME);
905 else
906 evsel__reset_sample_bit(evsel, TIME);
907 break;
908 case EVSEL__CONFIG_TERM_CALLGRAPH:
909 callgraph_buf = term->val.str;
910 break;
911 case EVSEL__CONFIG_TERM_BRANCH:
912 if (term->val.str && strcmp(term->val.str, "no")) {
913 evsel__set_sample_bit(evsel, BRANCH_STACK);
914 parse_branch_str(term->val.str,
915 &attr->branch_sample_type);
916 } else
917 evsel__reset_sample_bit(evsel, BRANCH_STACK);
918 break;
919 case EVSEL__CONFIG_TERM_STACK_USER:
920 dump_size = term->val.stack_user;
921 break;
922 case EVSEL__CONFIG_TERM_MAX_STACK:
923 max_stack = term->val.max_stack;
924 break;
925 case EVSEL__CONFIG_TERM_MAX_EVENTS:
926 evsel->max_events = term->val.max_events;
927 break;
928 case EVSEL__CONFIG_TERM_INHERIT:
929
930
931
932
933
934
935 attr->inherit = term->val.inherit ? 1 : 0;
936 break;
937 case EVSEL__CONFIG_TERM_OVERWRITE:
938 attr->write_backward = term->val.overwrite ? 1 : 0;
939 break;
940 case EVSEL__CONFIG_TERM_DRV_CFG:
941 break;
942 case EVSEL__CONFIG_TERM_PERCORE:
943 break;
944 case EVSEL__CONFIG_TERM_AUX_OUTPUT:
945 attr->aux_output = term->val.aux_output ? 1 : 0;
946 break;
947 case EVSEL__CONFIG_TERM_AUX_SAMPLE_SIZE:
948
949 break;
950 case EVSEL__CONFIG_TERM_CFG_CHG:
951 break;
952 default:
953 break;
954 }
955 }
956
957
958 if ((callgraph_buf != NULL) || (dump_size > 0) || max_stack) {
959 bool sample_address = false;
960
961 if (max_stack) {
962 param.max_stack = max_stack;
963 if (callgraph_buf == NULL)
964 callgraph_buf = "fp";
965 }
966
967
968 if (callgraph_buf != NULL) {
969 if (!strcmp(callgraph_buf, "no")) {
970 param.enabled = false;
971 param.record_mode = CALLCHAIN_NONE;
972 } else {
973 param.enabled = true;
974 if (parse_callchain_record(callgraph_buf, ¶m)) {
975 pr_err("per-event callgraph setting for %s failed. "
976 "Apply callgraph global setting for it\n",
977 evsel->name);
978 return;
979 }
980 if (param.record_mode == CALLCHAIN_DWARF)
981 sample_address = true;
982 }
983 }
984 if (dump_size > 0) {
985 dump_size = round_up(dump_size, sizeof(u64));
986 param.dump_size = dump_size;
987 }
988
989
990 if (callchain_param.enabled)
991 perf_evsel__reset_callgraph(evsel, &callchain_param);
992
993
994 if (param.enabled) {
995 if (sample_address) {
996 evsel__set_sample_bit(evsel, ADDR);
997 evsel__set_sample_bit(evsel, DATA_SRC);
998 evsel->core.attr.mmap_data = track;
999 }
1000 evsel__config_callchain(evsel, opts, ¶m);
1001 }
1002 }
1003}
1004
1005struct evsel_config_term *__evsel__get_config_term(struct evsel *evsel, enum evsel_term_type type)
1006{
1007 struct evsel_config_term *term, *found_term = NULL;
1008
1009 list_for_each_entry(term, &evsel->config_terms, list) {
1010 if (term->type == type)
1011 found_term = term;
1012 }
1013
1014 return found_term;
1015}
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045void evsel__config(struct evsel *evsel, struct record_opts *opts,
1046 struct callchain_param *callchain)
1047{
1048 struct evsel *leader = evsel->leader;
1049 struct perf_event_attr *attr = &evsel->core.attr;
1050 int track = evsel->tracking;
1051 bool per_cpu = opts->target.default_per_cpu && !opts->target.per_thread;
1052
1053 attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1;
1054 attr->inherit = !opts->no_inherit;
1055 attr->write_backward = opts->overwrite ? 1 : 0;
1056
1057 evsel__set_sample_bit(evsel, IP);
1058 evsel__set_sample_bit(evsel, TID);
1059
1060 if (evsel->sample_read) {
1061 evsel__set_sample_bit(evsel, READ);
1062
1063
1064
1065
1066
1067 evsel__set_sample_id(evsel, false);
1068
1069
1070
1071
1072
1073 if (leader->core.nr_members > 1) {
1074 attr->read_format |= PERF_FORMAT_GROUP;
1075 attr->inherit = 0;
1076 }
1077 }
1078
1079
1080
1081
1082
1083 if (!attr->sample_period) {
1084 if (opts->freq) {
1085 attr->freq = 1;
1086 attr->sample_freq = opts->freq;
1087 } else {
1088 attr->sample_period = opts->default_interval;
1089 }
1090 }
1091
1092
1093
1094
1095 if (attr->freq)
1096 evsel__set_sample_bit(evsel, PERIOD);
1097
1098 if (opts->no_samples)
1099 attr->sample_freq = 0;
1100
1101 if (opts->inherit_stat) {
1102 evsel->core.attr.read_format |=
1103 PERF_FORMAT_TOTAL_TIME_ENABLED |
1104 PERF_FORMAT_TOTAL_TIME_RUNNING |
1105 PERF_FORMAT_ID;
1106 attr->inherit_stat = 1;
1107 }
1108
1109 if (opts->sample_address) {
1110 evsel__set_sample_bit(evsel, ADDR);
1111 attr->mmap_data = track;
1112 }
1113
1114
1115
1116
1117
1118
1119 if (evsel__is_function_event(evsel))
1120 evsel->core.attr.exclude_callchain_user = 1;
1121
1122 if (callchain && callchain->enabled && !evsel->no_aux_samples)
1123 evsel__config_callchain(evsel, opts, callchain);
1124
1125 if (opts->sample_intr_regs && !evsel->no_aux_samples &&
1126 !evsel__is_dummy_event(evsel)) {
1127 attr->sample_regs_intr = opts->sample_intr_regs;
1128 evsel__set_sample_bit(evsel, REGS_INTR);
1129 }
1130
1131 if (opts->sample_user_regs && !evsel->no_aux_samples &&
1132 !evsel__is_dummy_event(evsel)) {
1133 attr->sample_regs_user |= opts->sample_user_regs;
1134 evsel__set_sample_bit(evsel, REGS_USER);
1135 }
1136
1137 if (target__has_cpu(&opts->target) || opts->sample_cpu)
1138 evsel__set_sample_bit(evsel, CPU);
1139
1140
1141
1142
1143 if (opts->sample_time &&
1144 (!perf_missing_features.sample_id_all &&
1145 (!opts->no_inherit || target__has_cpu(&opts->target) || per_cpu ||
1146 opts->sample_time_set)))
1147 evsel__set_sample_bit(evsel, TIME);
1148
1149 if (opts->raw_samples && !evsel->no_aux_samples) {
1150 evsel__set_sample_bit(evsel, TIME);
1151 evsel__set_sample_bit(evsel, RAW);
1152 evsel__set_sample_bit(evsel, CPU);
1153 }
1154
1155 if (opts->sample_address)
1156 evsel__set_sample_bit(evsel, DATA_SRC);
1157
1158 if (opts->sample_phys_addr)
1159 evsel__set_sample_bit(evsel, PHYS_ADDR);
1160
1161 if (opts->no_buffering) {
1162 attr->watermark = 0;
1163 attr->wakeup_events = 1;
1164 }
1165 if (opts->branch_stack && !evsel->no_aux_samples) {
1166 evsel__set_sample_bit(evsel, BRANCH_STACK);
1167 attr->branch_sample_type = opts->branch_stack;
1168 }
1169
1170 if (opts->sample_weight)
1171 evsel__set_sample_bit(evsel, WEIGHT);
1172
1173 attr->task = track;
1174 attr->mmap = track;
1175 attr->mmap2 = track && !perf_missing_features.mmap2;
1176 attr->comm = track;
1177
1178
1179
1180
1181 if (!opts->text_poke)
1182 attr->ksymbol = track && !perf_missing_features.ksymbol;
1183 attr->bpf_event = track && !opts->no_bpf_event && !perf_missing_features.bpf;
1184
1185 if (opts->record_namespaces)
1186 attr->namespaces = track;
1187
1188 if (opts->record_cgroup) {
1189 attr->cgroup = track && !perf_missing_features.cgroup;
1190 evsel__set_sample_bit(evsel, CGROUP);
1191 }
1192
1193 if (opts->record_switch_events)
1194 attr->context_switch = track;
1195
1196 if (opts->sample_transaction)
1197 evsel__set_sample_bit(evsel, TRANSACTION);
1198
1199 if (opts->running_time) {
1200 evsel->core.attr.read_format |=
1201 PERF_FORMAT_TOTAL_TIME_ENABLED |
1202 PERF_FORMAT_TOTAL_TIME_RUNNING;
1203 }
1204
1205
1206
1207
1208
1209
1210
1211 if (evsel__is_group_leader(evsel))
1212 attr->disabled = 1;
1213
1214
1215
1216
1217
1218 if (target__none(&opts->target) && evsel__is_group_leader(evsel) &&
1219 !opts->initial_delay)
1220 attr->enable_on_exec = 1;
1221
1222 if (evsel->immediate) {
1223 attr->disabled = 0;
1224 attr->enable_on_exec = 0;
1225 }
1226
1227 clockid = opts->clockid;
1228 if (opts->use_clockid) {
1229 attr->use_clockid = 1;
1230 attr->clockid = opts->clockid;
1231 }
1232
1233 if (evsel->precise_max)
1234 attr->precise_ip = 3;
1235
1236 if (opts->all_user) {
1237 attr->exclude_kernel = 1;
1238 attr->exclude_user = 0;
1239 }
1240
1241 if (opts->all_kernel) {
1242 attr->exclude_kernel = 0;
1243 attr->exclude_user = 1;
1244 }
1245
1246 if (evsel->core.own_cpus || evsel->unit)
1247 evsel->core.attr.read_format |= PERF_FORMAT_ID;
1248
1249
1250
1251
1252
1253 evsel__apply_config_terms(evsel, opts, track);
1254
1255 evsel->ignore_missing_thread = opts->ignore_missing_thread;
1256
1257
1258 if (opts->period_set) {
1259 if (opts->period)
1260 evsel__set_sample_bit(evsel, PERIOD);
1261 else
1262 evsel__reset_sample_bit(evsel, PERIOD);
1263 }
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273 if (evsel__is_dummy_event(evsel))
1274 evsel__reset_sample_bit(evsel, BRANCH_STACK);
1275}
1276
1277int evsel__set_filter(struct evsel *evsel, const char *filter)
1278{
1279 char *new_filter = strdup(filter);
1280
1281 if (new_filter != NULL) {
1282 free(evsel->filter);
1283 evsel->filter = new_filter;
1284 return 0;
1285 }
1286
1287 return -1;
1288}
1289
1290static int evsel__append_filter(struct evsel *evsel, const char *fmt, const char *filter)
1291{
1292 char *new_filter;
1293
1294 if (evsel->filter == NULL)
1295 return evsel__set_filter(evsel, filter);
1296
1297 if (asprintf(&new_filter, fmt, evsel->filter, filter) > 0) {
1298 free(evsel->filter);
1299 evsel->filter = new_filter;
1300 return 0;
1301 }
1302
1303 return -1;
1304}
1305
1306int evsel__append_tp_filter(struct evsel *evsel, const char *filter)
1307{
1308 return evsel__append_filter(evsel, "(%s) && (%s)", filter);
1309}
1310
1311int evsel__append_addr_filter(struct evsel *evsel, const char *filter)
1312{
1313 return evsel__append_filter(evsel, "%s,%s", filter);
1314}
1315
1316
1317int evsel__enable_cpu(struct evsel *evsel, int cpu)
1318{
1319 return perf_evsel__enable_cpu(&evsel->core, cpu);
1320}
1321
1322int evsel__enable(struct evsel *evsel)
1323{
1324 int err = perf_evsel__enable(&evsel->core);
1325
1326 if (!err)
1327 evsel->disabled = false;
1328 return err;
1329}
1330
1331
1332int evsel__disable_cpu(struct evsel *evsel, int cpu)
1333{
1334 return perf_evsel__disable_cpu(&evsel->core, cpu);
1335}
1336
1337int evsel__disable(struct evsel *evsel)
1338{
1339 int err = perf_evsel__disable(&evsel->core);
1340
1341
1342
1343
1344
1345
1346 if (!err)
1347 evsel->disabled = true;
1348
1349 return err;
1350}
1351
1352static void evsel__free_config_terms(struct evsel *evsel)
1353{
1354 struct evsel_config_term *term, *h;
1355
1356 list_for_each_entry_safe(term, h, &evsel->config_terms, list) {
1357 list_del_init(&term->list);
1358 if (term->free_str)
1359 zfree(&term->val.str);
1360 free(term);
1361 }
1362}
1363
1364void evsel__exit(struct evsel *evsel)
1365{
1366 assert(list_empty(&evsel->core.node));
1367 assert(evsel->evlist == NULL);
1368 evsel__free_counts(evsel);
1369 perf_evsel__free_fd(&evsel->core);
1370 perf_evsel__free_id(&evsel->core);
1371 evsel__free_config_terms(evsel);
1372 cgroup__put(evsel->cgrp);
1373 perf_cpu_map__put(evsel->core.cpus);
1374 perf_cpu_map__put(evsel->core.own_cpus);
1375 perf_thread_map__put(evsel->core.threads);
1376 zfree(&evsel->group_name);
1377 zfree(&evsel->name);
1378 zfree(&evsel->pmu_name);
1379 zfree(&evsel->per_pkg_mask);
1380 zfree(&evsel->metric_events);
1381 perf_evsel__object.fini(evsel);
1382}
1383
1384void evsel__delete(struct evsel *evsel)
1385{
1386 evsel__exit(evsel);
1387 free(evsel);
1388}
1389
1390void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread,
1391 struct perf_counts_values *count)
1392{
1393 struct perf_counts_values tmp;
1394
1395 if (!evsel->prev_raw_counts)
1396 return;
1397
1398 if (cpu == -1) {
1399 tmp = evsel->prev_raw_counts->aggr;
1400 evsel->prev_raw_counts->aggr = *count;
1401 } else {
1402 tmp = *perf_counts(evsel->prev_raw_counts, cpu, thread);
1403 *perf_counts(evsel->prev_raw_counts, cpu, thread) = *count;
1404 }
1405
1406 count->val = count->val - tmp.val;
1407 count->ena = count->ena - tmp.ena;
1408 count->run = count->run - tmp.run;
1409}
1410
1411void perf_counts_values__scale(struct perf_counts_values *count,
1412 bool scale, s8 *pscaled)
1413{
1414 s8 scaled = 0;
1415
1416 if (scale) {
1417 if (count->run == 0) {
1418 scaled = -1;
1419 count->val = 0;
1420 } else if (count->run < count->ena) {
1421 scaled = 1;
1422 count->val = (u64)((double) count->val * count->ena / count->run);
1423 }
1424 }
1425
1426 if (pscaled)
1427 *pscaled = scaled;
1428}
1429
1430static int evsel__read_one(struct evsel *evsel, int cpu, int thread)
1431{
1432 struct perf_counts_values *count = perf_counts(evsel->counts, cpu, thread);
1433
1434 return perf_evsel__read(&evsel->core, cpu, thread, count);
1435}
1436
1437static void
1438perf_evsel__set_count(struct evsel *counter, int cpu, int thread,
1439 u64 val, u64 ena, u64 run)
1440{
1441 struct perf_counts_values *count;
1442
1443 count = perf_counts(counter->counts, cpu, thread);
1444
1445 count->val = val;
1446 count->ena = ena;
1447 count->run = run;
1448
1449 perf_counts__set_loaded(counter->counts, cpu, thread, true);
1450}
1451
1452static int
1453perf_evsel__process_group_data(struct evsel *leader,
1454 int cpu, int thread, u64 *data)
1455{
1456 u64 read_format = leader->core.attr.read_format;
1457 struct sample_read_value *v;
1458 u64 nr, ena = 0, run = 0, i;
1459
1460 nr = *data++;
1461
1462 if (nr != (u64) leader->core.nr_members)
1463 return -EINVAL;
1464
1465 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
1466 ena = *data++;
1467
1468 if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
1469 run = *data++;
1470
1471 v = (struct sample_read_value *) data;
1472
1473 perf_evsel__set_count(leader, cpu, thread,
1474 v[0].value, ena, run);
1475
1476 for (i = 1; i < nr; i++) {
1477 struct evsel *counter;
1478
1479 counter = perf_evlist__id2evsel(leader->evlist, v[i].id);
1480 if (!counter)
1481 return -EINVAL;
1482
1483 perf_evsel__set_count(counter, cpu, thread,
1484 v[i].value, ena, run);
1485 }
1486
1487 return 0;
1488}
1489
1490static int evsel__read_group(struct evsel *leader, int cpu, int thread)
1491{
1492 struct perf_stat_evsel *ps = leader->stats;
1493 u64 read_format = leader->core.attr.read_format;
1494 int size = perf_evsel__read_size(&leader->core);
1495 u64 *data = ps->group_data;
1496
1497 if (!(read_format & PERF_FORMAT_ID))
1498 return -EINVAL;
1499
1500 if (!evsel__is_group_leader(leader))
1501 return -EINVAL;
1502
1503 if (!data) {
1504 data = zalloc(size);
1505 if (!data)
1506 return -ENOMEM;
1507
1508 ps->group_data = data;
1509 }
1510
1511 if (FD(leader, cpu, thread) < 0)
1512 return -EINVAL;
1513
1514 if (readn(FD(leader, cpu, thread), data, size) <= 0)
1515 return -errno;
1516
1517 return perf_evsel__process_group_data(leader, cpu, thread, data);
1518}
1519
1520int evsel__read_counter(struct evsel *evsel, int cpu, int thread)
1521{
1522 u64 read_format = evsel->core.attr.read_format;
1523
1524 if (read_format & PERF_FORMAT_GROUP)
1525 return evsel__read_group(evsel, cpu, thread);
1526
1527 return evsel__read_one(evsel, cpu, thread);
1528}
1529
1530int __evsel__read_on_cpu(struct evsel *evsel, int cpu, int thread, bool scale)
1531{
1532 struct perf_counts_values count;
1533 size_t nv = scale ? 3 : 1;
1534
1535 if (FD(evsel, cpu, thread) < 0)
1536 return -EINVAL;
1537
1538 if (evsel->counts == NULL && evsel__alloc_counts(evsel, cpu + 1, thread + 1) < 0)
1539 return -ENOMEM;
1540
1541 if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) <= 0)
1542 return -errno;
1543
1544 evsel__compute_deltas(evsel, cpu, thread, &count);
1545 perf_counts_values__scale(&count, scale, NULL);
1546 *perf_counts(evsel->counts, cpu, thread) = count;
1547 return 0;
1548}
1549
1550static int get_group_fd(struct evsel *evsel, int cpu, int thread)
1551{
1552 struct evsel *leader = evsel->leader;
1553 int fd;
1554
1555 if (evsel__is_group_leader(evsel))
1556 return -1;
1557
1558
1559
1560
1561
1562 BUG_ON(!leader->core.fd);
1563
1564 fd = FD(leader, cpu, thread);
1565 BUG_ON(fd == -1);
1566
1567 return fd;
1568}
1569
1570static void perf_evsel__remove_fd(struct evsel *pos,
1571 int nr_cpus, int nr_threads,
1572 int thread_idx)
1573{
1574 for (int cpu = 0; cpu < nr_cpus; cpu++)
1575 for (int thread = thread_idx; thread < nr_threads - 1; thread++)
1576 FD(pos, cpu, thread) = FD(pos, cpu, thread + 1);
1577}
1578
1579static int update_fds(struct evsel *evsel,
1580 int nr_cpus, int cpu_idx,
1581 int nr_threads, int thread_idx)
1582{
1583 struct evsel *pos;
1584
1585 if (cpu_idx >= nr_cpus || thread_idx >= nr_threads)
1586 return -EINVAL;
1587
1588 evlist__for_each_entry(evsel->evlist, pos) {
1589 nr_cpus = pos != evsel ? nr_cpus : cpu_idx;
1590
1591 perf_evsel__remove_fd(pos, nr_cpus, nr_threads, thread_idx);
1592
1593
1594
1595
1596
1597 if (pos == evsel)
1598 break;
1599 }
1600 return 0;
1601}
1602
1603static bool ignore_missing_thread(struct evsel *evsel,
1604 int nr_cpus, int cpu,
1605 struct perf_thread_map *threads,
1606 int thread, int err)
1607{
1608 pid_t ignore_pid = perf_thread_map__pid(threads, thread);
1609
1610 if (!evsel->ignore_missing_thread)
1611 return false;
1612
1613
1614 if (evsel->core.system_wide)
1615 return false;
1616
1617
1618 if (err != -ESRCH)
1619 return false;
1620
1621
1622 if (threads->nr == 1)
1623 return false;
1624
1625
1626
1627
1628
1629 if (update_fds(evsel, nr_cpus, cpu, threads->nr, thread))
1630 return false;
1631
1632 if (thread_map__remove(threads, thread))
1633 return false;
1634
1635 pr_warning("WARNING: Ignored open failure for pid %d\n",
1636 ignore_pid);
1637 return true;
1638}
1639
1640static int __open_attr__fprintf(FILE *fp, const char *name, const char *val,
1641 void *priv __maybe_unused)
1642{
1643 return fprintf(fp, " %-32s %s\n", name, val);
1644}
1645
1646static void display_attr(struct perf_event_attr *attr)
1647{
1648 if (verbose >= 2 || debug_peo_args) {
1649 fprintf(stderr, "%.60s\n", graph_dotted_line);
1650 fprintf(stderr, "perf_event_attr:\n");
1651 perf_event_attr__fprintf(stderr, attr, __open_attr__fprintf, NULL);
1652 fprintf(stderr, "%.60s\n", graph_dotted_line);
1653 }
1654}
1655
1656static int perf_event_open(struct evsel *evsel,
1657 pid_t pid, int cpu, int group_fd,
1658 unsigned long flags)
1659{
1660 int precise_ip = evsel->core.attr.precise_ip;
1661 int fd;
1662
1663 while (1) {
1664 pr_debug2_peo("sys_perf_event_open: pid %d cpu %d group_fd %d flags %#lx",
1665 pid, cpu, group_fd, flags);
1666
1667 fd = sys_perf_event_open(&evsel->core.attr, pid, cpu, group_fd, flags);
1668 if (fd >= 0)
1669 break;
1670
1671
1672 if (!evsel->precise_max)
1673 break;
1674
1675
1676
1677
1678
1679 if (!evsel->core.attr.precise_ip) {
1680 evsel->core.attr.precise_ip = precise_ip;
1681 break;
1682 }
1683
1684 pr_debug2_peo("\nsys_perf_event_open failed, error %d\n", -ENOTSUP);
1685 evsel->core.attr.precise_ip--;
1686 pr_debug2_peo("decreasing precise_ip by one (%d)\n", evsel->core.attr.precise_ip);
1687 display_attr(&evsel->core.attr);
1688 }
1689
1690 return fd;
1691}
1692
1693static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus,
1694 struct perf_thread_map *threads,
1695 int start_cpu, int end_cpu)
1696{
1697 int cpu, thread, nthreads;
1698 unsigned long flags = PERF_FLAG_FD_CLOEXEC;
1699 int pid = -1, err, old_errno;
1700 enum { NO_CHANGE, SET_TO_MAX, INCREASED_MAX } set_rlimit = NO_CHANGE;
1701
1702 if ((perf_missing_features.write_backward && evsel->core.attr.write_backward) ||
1703 (perf_missing_features.aux_output && evsel->core.attr.aux_output))
1704 return -EINVAL;
1705
1706 if (cpus == NULL) {
1707 static struct perf_cpu_map *empty_cpu_map;
1708
1709 if (empty_cpu_map == NULL) {
1710 empty_cpu_map = perf_cpu_map__dummy_new();
1711 if (empty_cpu_map == NULL)
1712 return -ENOMEM;
1713 }
1714
1715 cpus = empty_cpu_map;
1716 }
1717
1718 if (threads == NULL) {
1719 static struct perf_thread_map *empty_thread_map;
1720
1721 if (empty_thread_map == NULL) {
1722 empty_thread_map = thread_map__new_by_tid(-1);
1723 if (empty_thread_map == NULL)
1724 return -ENOMEM;
1725 }
1726
1727 threads = empty_thread_map;
1728 }
1729
1730 if (evsel->core.system_wide)
1731 nthreads = 1;
1732 else
1733 nthreads = threads->nr;
1734
1735 if (evsel->core.fd == NULL &&
1736 perf_evsel__alloc_fd(&evsel->core, cpus->nr, nthreads) < 0)
1737 return -ENOMEM;
1738
1739 if (evsel->cgrp) {
1740 flags |= PERF_FLAG_PID_CGROUP;
1741 pid = evsel->cgrp->fd;
1742 }
1743
1744fallback_missing_features:
1745 if (perf_missing_features.clockid_wrong)
1746 evsel->core.attr.clockid = CLOCK_MONOTONIC;
1747 if (perf_missing_features.clockid) {
1748 evsel->core.attr.use_clockid = 0;
1749 evsel->core.attr.clockid = 0;
1750 }
1751 if (perf_missing_features.cloexec)
1752 flags &= ~(unsigned long)PERF_FLAG_FD_CLOEXEC;
1753 if (perf_missing_features.mmap2)
1754 evsel->core.attr.mmap2 = 0;
1755 if (perf_missing_features.exclude_guest)
1756 evsel->core.attr.exclude_guest = evsel->core.attr.exclude_host = 0;
1757 if (perf_missing_features.lbr_flags)
1758 evsel->core.attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS |
1759 PERF_SAMPLE_BRANCH_NO_CYCLES);
1760 if (perf_missing_features.group_read && evsel->core.attr.inherit)
1761 evsel->core.attr.read_format &= ~(PERF_FORMAT_GROUP|PERF_FORMAT_ID);
1762 if (perf_missing_features.ksymbol)
1763 evsel->core.attr.ksymbol = 0;
1764 if (perf_missing_features.bpf)
1765 evsel->core.attr.bpf_event = 0;
1766 if (perf_missing_features.branch_hw_idx)
1767 evsel->core.attr.branch_sample_type &= ~PERF_SAMPLE_BRANCH_HW_INDEX;
1768retry_sample_id:
1769 if (perf_missing_features.sample_id_all)
1770 evsel->core.attr.sample_id_all = 0;
1771
1772 display_attr(&evsel->core.attr);
1773
1774 for (cpu = start_cpu; cpu < end_cpu; cpu++) {
1775
1776 for (thread = 0; thread < nthreads; thread++) {
1777 int fd, group_fd;
1778
1779 if (!evsel->cgrp && !evsel->core.system_wide)
1780 pid = perf_thread_map__pid(threads, thread);
1781
1782 group_fd = get_group_fd(evsel, cpu, thread);
1783retry_open:
1784 test_attr__ready();
1785
1786 fd = perf_event_open(evsel, pid, cpus->map[cpu],
1787 group_fd, flags);
1788
1789 FD(evsel, cpu, thread) = fd;
1790
1791 if (unlikely(test_attr__enabled)) {
1792 test_attr__open(&evsel->core.attr, pid, cpus->map[cpu],
1793 fd, group_fd, flags);
1794 }
1795
1796 if (fd < 0) {
1797 err = -errno;
1798
1799 if (ignore_missing_thread(evsel, cpus->nr, cpu, threads, thread, err)) {
1800
1801
1802
1803
1804
1805 nthreads--;
1806 thread--;
1807
1808
1809 err = 0;
1810 continue;
1811 }
1812
1813 pr_debug2_peo("\nsys_perf_event_open failed, error %d\n",
1814 err);
1815 goto try_fallback;
1816 }
1817
1818 pr_debug2_peo(" = %d\n", fd);
1819
1820 if (evsel->bpf_fd >= 0) {
1821 int evt_fd = fd;
1822 int bpf_fd = evsel->bpf_fd;
1823
1824 err = ioctl(evt_fd,
1825 PERF_EVENT_IOC_SET_BPF,
1826 bpf_fd);
1827 if (err && errno != EEXIST) {
1828 pr_err("failed to attach bpf fd %d: %s\n",
1829 bpf_fd, strerror(errno));
1830 err = -EINVAL;
1831 goto out_close;
1832 }
1833 }
1834
1835 set_rlimit = NO_CHANGE;
1836
1837
1838
1839
1840
1841 if (perf_missing_features.clockid ||
1842 perf_missing_features.clockid_wrong) {
1843 err = -EINVAL;
1844 goto out_close;
1845 }
1846 }
1847 }
1848
1849 return 0;
1850
1851try_fallback:
1852
1853
1854
1855
1856 if (err == -EMFILE && set_rlimit < INCREASED_MAX) {
1857 struct rlimit l;
1858
1859 old_errno = errno;
1860 if (getrlimit(RLIMIT_NOFILE, &l) == 0) {
1861 if (set_rlimit == NO_CHANGE)
1862 l.rlim_cur = l.rlim_max;
1863 else {
1864 l.rlim_cur = l.rlim_max + 1000;
1865 l.rlim_max = l.rlim_cur;
1866 }
1867 if (setrlimit(RLIMIT_NOFILE, &l) == 0) {
1868 set_rlimit++;
1869 errno = old_errno;
1870 goto retry_open;
1871 }
1872 }
1873 errno = old_errno;
1874 }
1875
1876 if (err != -EINVAL || cpu > 0 || thread > 0)
1877 goto out_close;
1878
1879
1880
1881
1882
1883 if (!perf_missing_features.cgroup && evsel->core.attr.cgroup) {
1884 perf_missing_features.cgroup = true;
1885 pr_debug2_peo("Kernel has no cgroup sampling support, bailing out\n");
1886 goto out_close;
1887 } else if (!perf_missing_features.branch_hw_idx &&
1888 (evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX)) {
1889 perf_missing_features.branch_hw_idx = true;
1890 pr_debug2("switching off branch HW index support\n");
1891 goto fallback_missing_features;
1892 } else if (!perf_missing_features.aux_output && evsel->core.attr.aux_output) {
1893 perf_missing_features.aux_output = true;
1894 pr_debug2_peo("Kernel has no attr.aux_output support, bailing out\n");
1895 goto out_close;
1896 } else if (!perf_missing_features.bpf && evsel->core.attr.bpf_event) {
1897 perf_missing_features.bpf = true;
1898 pr_debug2_peo("switching off bpf_event\n");
1899 goto fallback_missing_features;
1900 } else if (!perf_missing_features.ksymbol && evsel->core.attr.ksymbol) {
1901 perf_missing_features.ksymbol = true;
1902 pr_debug2_peo("switching off ksymbol\n");
1903 goto fallback_missing_features;
1904 } else if (!perf_missing_features.write_backward && evsel->core.attr.write_backward) {
1905 perf_missing_features.write_backward = true;
1906 pr_debug2_peo("switching off write_backward\n");
1907 goto out_close;
1908 } else if (!perf_missing_features.clockid_wrong && evsel->core.attr.use_clockid) {
1909 perf_missing_features.clockid_wrong = true;
1910 pr_debug2_peo("switching off clockid\n");
1911 goto fallback_missing_features;
1912 } else if (!perf_missing_features.clockid && evsel->core.attr.use_clockid) {
1913 perf_missing_features.clockid = true;
1914 pr_debug2_peo("switching off use_clockid\n");
1915 goto fallback_missing_features;
1916 } else if (!perf_missing_features.cloexec && (flags & PERF_FLAG_FD_CLOEXEC)) {
1917 perf_missing_features.cloexec = true;
1918 pr_debug2_peo("switching off cloexec flag\n");
1919 goto fallback_missing_features;
1920 } else if (!perf_missing_features.mmap2 && evsel->core.attr.mmap2) {
1921 perf_missing_features.mmap2 = true;
1922 pr_debug2_peo("switching off mmap2\n");
1923 goto fallback_missing_features;
1924 } else if (!perf_missing_features.exclude_guest &&
1925 (evsel->core.attr.exclude_guest || evsel->core.attr.exclude_host)) {
1926 perf_missing_features.exclude_guest = true;
1927 pr_debug2_peo("switching off exclude_guest, exclude_host\n");
1928 goto fallback_missing_features;
1929 } else if (!perf_missing_features.sample_id_all) {
1930 perf_missing_features.sample_id_all = true;
1931 pr_debug2_peo("switching off sample_id_all\n");
1932 goto retry_sample_id;
1933 } else if (!perf_missing_features.lbr_flags &&
1934 (evsel->core.attr.branch_sample_type &
1935 (PERF_SAMPLE_BRANCH_NO_CYCLES |
1936 PERF_SAMPLE_BRANCH_NO_FLAGS))) {
1937 perf_missing_features.lbr_flags = true;
1938 pr_debug2_peo("switching off branch sample type no (cycles/flags)\n");
1939 goto fallback_missing_features;
1940 } else if (!perf_missing_features.group_read &&
1941 evsel->core.attr.inherit &&
1942 (evsel->core.attr.read_format & PERF_FORMAT_GROUP) &&
1943 evsel__is_group_leader(evsel)) {
1944 perf_missing_features.group_read = true;
1945 pr_debug2_peo("switching off group read\n");
1946 goto fallback_missing_features;
1947 }
1948out_close:
1949 if (err)
1950 threads->err_thread = thread;
1951
1952 old_errno = errno;
1953 do {
1954 while (--thread >= 0) {
1955 if (FD(evsel, cpu, thread) >= 0)
1956 close(FD(evsel, cpu, thread));
1957 FD(evsel, cpu, thread) = -1;
1958 }
1959 thread = nthreads;
1960 } while (--cpu >= 0);
1961 errno = old_errno;
1962 return err;
1963}
1964
1965int evsel__open(struct evsel *evsel, struct perf_cpu_map *cpus,
1966 struct perf_thread_map *threads)
1967{
1968 return evsel__open_cpu(evsel, cpus, threads, 0, cpus ? cpus->nr : 1);
1969}
1970
1971void evsel__close(struct evsel *evsel)
1972{
1973 perf_evsel__close(&evsel->core);
1974 perf_evsel__free_id(&evsel->core);
1975}
1976
1977int evsel__open_per_cpu(struct evsel *evsel, struct perf_cpu_map *cpus, int cpu)
1978{
1979 if (cpu == -1)
1980 return evsel__open_cpu(evsel, cpus, NULL, 0,
1981 cpus ? cpus->nr : 1);
1982
1983 return evsel__open_cpu(evsel, cpus, NULL, cpu, cpu + 1);
1984}
1985
1986int evsel__open_per_thread(struct evsel *evsel, struct perf_thread_map *threads)
1987{
1988 return evsel__open(evsel, NULL, threads);
1989}
1990
1991static int perf_evsel__parse_id_sample(const struct evsel *evsel,
1992 const union perf_event *event,
1993 struct perf_sample *sample)
1994{
1995 u64 type = evsel->core.attr.sample_type;
1996 const __u64 *array = event->sample.array;
1997 bool swapped = evsel->needs_swap;
1998 union u64_swap u;
1999
2000 array += ((event->header.size -
2001 sizeof(event->header)) / sizeof(u64)) - 1;
2002
2003 if (type & PERF_SAMPLE_IDENTIFIER) {
2004 sample->id = *array;
2005 array--;
2006 }
2007
2008 if (type & PERF_SAMPLE_CPU) {
2009 u.val64 = *array;
2010 if (swapped) {
2011
2012 u.val64 = bswap_64(u.val64);
2013 u.val32[0] = bswap_32(u.val32[0]);
2014 }
2015
2016 sample->cpu = u.val32[0];
2017 array--;
2018 }
2019
2020 if (type & PERF_SAMPLE_STREAM_ID) {
2021 sample->stream_id = *array;
2022 array--;
2023 }
2024
2025 if (type & PERF_SAMPLE_ID) {
2026 sample->id = *array;
2027 array--;
2028 }
2029
2030 if (type & PERF_SAMPLE_TIME) {
2031 sample->time = *array;
2032 array--;
2033 }
2034
2035 if (type & PERF_SAMPLE_TID) {
2036 u.val64 = *array;
2037 if (swapped) {
2038
2039 u.val64 = bswap_64(u.val64);
2040 u.val32[0] = bswap_32(u.val32[0]);
2041 u.val32[1] = bswap_32(u.val32[1]);
2042 }
2043
2044 sample->pid = u.val32[0];
2045 sample->tid = u.val32[1];
2046 array--;
2047 }
2048
2049 return 0;
2050}
2051
2052static inline bool overflow(const void *endp, u16 max_size, const void *offset,
2053 u64 size)
2054{
2055 return size > max_size || offset + size > endp;
2056}
2057
2058#define OVERFLOW_CHECK(offset, size, max_size) \
2059 do { \
2060 if (overflow(endp, (max_size), (offset), (size))) \
2061 return -EFAULT; \
2062 } while (0)
2063
2064#define OVERFLOW_CHECK_u64(offset) \
2065 OVERFLOW_CHECK(offset, sizeof(u64), sizeof(u64))
2066
2067static int
2068perf_event__check_size(union perf_event *event, unsigned int sample_size)
2069{
2070
2071
2072
2073
2074
2075 if (sample_size + sizeof(event->header) > event->header.size)
2076 return -EFAULT;
2077
2078 return 0;
2079}
2080
2081int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
2082 struct perf_sample *data)
2083{
2084 u64 type = evsel->core.attr.sample_type;
2085 bool swapped = evsel->needs_swap;
2086 const __u64 *array;
2087 u16 max_size = event->header.size;
2088 const void *endp = (void *)event + max_size;
2089 u64 sz;
2090
2091
2092
2093
2094
2095 union u64_swap u;
2096
2097 memset(data, 0, sizeof(*data));
2098 data->cpu = data->pid = data->tid = -1;
2099 data->stream_id = data->id = data->time = -1ULL;
2100 data->period = evsel->core.attr.sample_period;
2101 data->cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
2102 data->misc = event->header.misc;
2103 data->id = -1ULL;
2104 data->data_src = PERF_MEM_DATA_SRC_NONE;
2105
2106 if (event->header.type != PERF_RECORD_SAMPLE) {
2107 if (!evsel->core.attr.sample_id_all)
2108 return 0;
2109 return perf_evsel__parse_id_sample(evsel, event, data);
2110 }
2111
2112 array = event->sample.array;
2113
2114 if (perf_event__check_size(event, evsel->sample_size))
2115 return -EFAULT;
2116
2117 if (type & PERF_SAMPLE_IDENTIFIER) {
2118 data->id = *array;
2119 array++;
2120 }
2121
2122 if (type & PERF_SAMPLE_IP) {
2123 data->ip = *array;
2124 array++;
2125 }
2126
2127 if (type & PERF_SAMPLE_TID) {
2128 u.val64 = *array;
2129 if (swapped) {
2130
2131 u.val64 = bswap_64(u.val64);
2132 u.val32[0] = bswap_32(u.val32[0]);
2133 u.val32[1] = bswap_32(u.val32[1]);
2134 }
2135
2136 data->pid = u.val32[0];
2137 data->tid = u.val32[1];
2138 array++;
2139 }
2140
2141 if (type & PERF_SAMPLE_TIME) {
2142 data->time = *array;
2143 array++;
2144 }
2145
2146 if (type & PERF_SAMPLE_ADDR) {
2147 data->addr = *array;
2148 array++;
2149 }
2150
2151 if (type & PERF_SAMPLE_ID) {
2152 data->id = *array;
2153 array++;
2154 }
2155
2156 if (type & PERF_SAMPLE_STREAM_ID) {
2157 data->stream_id = *array;
2158 array++;
2159 }
2160
2161 if (type & PERF_SAMPLE_CPU) {
2162
2163 u.val64 = *array;
2164 if (swapped) {
2165
2166 u.val64 = bswap_64(u.val64);
2167 u.val32[0] = bswap_32(u.val32[0]);
2168 }
2169
2170 data->cpu = u.val32[0];
2171 array++;
2172 }
2173
2174 if (type & PERF_SAMPLE_PERIOD) {
2175 data->period = *array;
2176 array++;
2177 }
2178
2179 if (type & PERF_SAMPLE_READ) {
2180 u64 read_format = evsel->core.attr.read_format;
2181
2182 OVERFLOW_CHECK_u64(array);
2183 if (read_format & PERF_FORMAT_GROUP)
2184 data->read.group.nr = *array;
2185 else
2186 data->read.one.value = *array;
2187
2188 array++;
2189
2190 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) {
2191 OVERFLOW_CHECK_u64(array);
2192 data->read.time_enabled = *array;
2193 array++;
2194 }
2195
2196 if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) {
2197 OVERFLOW_CHECK_u64(array);
2198 data->read.time_running = *array;
2199 array++;
2200 }
2201
2202
2203 if (read_format & PERF_FORMAT_GROUP) {
2204 const u64 max_group_nr = UINT64_MAX /
2205 sizeof(struct sample_read_value);
2206
2207 if (data->read.group.nr > max_group_nr)
2208 return -EFAULT;
2209 sz = data->read.group.nr *
2210 sizeof(struct sample_read_value);
2211 OVERFLOW_CHECK(array, sz, max_size);
2212 data->read.group.values =
2213 (struct sample_read_value *)array;
2214 array = (void *)array + sz;
2215 } else {
2216 OVERFLOW_CHECK_u64(array);
2217 data->read.one.id = *array;
2218 array++;
2219 }
2220 }
2221
2222 if (type & PERF_SAMPLE_CALLCHAIN) {
2223 const u64 max_callchain_nr = UINT64_MAX / sizeof(u64);
2224
2225 OVERFLOW_CHECK_u64(array);
2226 data->callchain = (struct ip_callchain *)array++;
2227 if (data->callchain->nr > max_callchain_nr)
2228 return -EFAULT;
2229 sz = data->callchain->nr * sizeof(u64);
2230 OVERFLOW_CHECK(array, sz, max_size);
2231 array = (void *)array + sz;
2232 }
2233
2234 if (type & PERF_SAMPLE_RAW) {
2235 OVERFLOW_CHECK_u64(array);
2236 u.val64 = *array;
2237
2238
2239
2240
2241
2242
2243
2244 if (swapped) {
2245 u.val64 = bswap_64(u.val64);
2246 u.val32[0] = bswap_32(u.val32[0]);
2247 u.val32[1] = bswap_32(u.val32[1]);
2248 }
2249 data->raw_size = u.val32[0];
2250
2251
2252
2253
2254
2255 if (swapped)
2256 mem_bswap_64((void *) array, data->raw_size);
2257
2258 array = (void *)array + sizeof(u32);
2259
2260 OVERFLOW_CHECK(array, data->raw_size, max_size);
2261 data->raw_data = (void *)array;
2262 array = (void *)array + data->raw_size;
2263 }
2264
2265 if (type & PERF_SAMPLE_BRANCH_STACK) {
2266 const u64 max_branch_nr = UINT64_MAX /
2267 sizeof(struct branch_entry);
2268
2269 OVERFLOW_CHECK_u64(array);
2270 data->branch_stack = (struct branch_stack *)array++;
2271
2272 if (data->branch_stack->nr > max_branch_nr)
2273 return -EFAULT;
2274
2275 sz = data->branch_stack->nr * sizeof(struct branch_entry);
2276 if (evsel__has_branch_hw_idx(evsel))
2277 sz += sizeof(u64);
2278 else
2279 data->no_hw_idx = true;
2280 OVERFLOW_CHECK(array, sz, max_size);
2281 array = (void *)array + sz;
2282 }
2283
2284 if (type & PERF_SAMPLE_REGS_USER) {
2285 OVERFLOW_CHECK_u64(array);
2286 data->user_regs.abi = *array;
2287 array++;
2288
2289 if (data->user_regs.abi) {
2290 u64 mask = evsel->core.attr.sample_regs_user;
2291
2292 sz = hweight64(mask) * sizeof(u64);
2293 OVERFLOW_CHECK(array, sz, max_size);
2294 data->user_regs.mask = mask;
2295 data->user_regs.regs = (u64 *)array;
2296 array = (void *)array + sz;
2297 }
2298 }
2299
2300 if (type & PERF_SAMPLE_STACK_USER) {
2301 OVERFLOW_CHECK_u64(array);
2302 sz = *array++;
2303
2304 data->user_stack.offset = ((char *)(array - 1)
2305 - (char *) event);
2306
2307 if (!sz) {
2308 data->user_stack.size = 0;
2309 } else {
2310 OVERFLOW_CHECK(array, sz, max_size);
2311 data->user_stack.data = (char *)array;
2312 array = (void *)array + sz;
2313 OVERFLOW_CHECK_u64(array);
2314 data->user_stack.size = *array++;
2315 if (WARN_ONCE(data->user_stack.size > sz,
2316 "user stack dump failure\n"))
2317 return -EFAULT;
2318 }
2319 }
2320
2321 if (type & PERF_SAMPLE_WEIGHT) {
2322 OVERFLOW_CHECK_u64(array);
2323 data->weight = *array;
2324 array++;
2325 }
2326
2327 if (type & PERF_SAMPLE_DATA_SRC) {
2328 OVERFLOW_CHECK_u64(array);
2329 data->data_src = *array;
2330 array++;
2331 }
2332
2333 if (type & PERF_SAMPLE_TRANSACTION) {
2334 OVERFLOW_CHECK_u64(array);
2335 data->transaction = *array;
2336 array++;
2337 }
2338
2339 data->intr_regs.abi = PERF_SAMPLE_REGS_ABI_NONE;
2340 if (type & PERF_SAMPLE_REGS_INTR) {
2341 OVERFLOW_CHECK_u64(array);
2342 data->intr_regs.abi = *array;
2343 array++;
2344
2345 if (data->intr_regs.abi != PERF_SAMPLE_REGS_ABI_NONE) {
2346 u64 mask = evsel->core.attr.sample_regs_intr;
2347
2348 sz = hweight64(mask) * sizeof(u64);
2349 OVERFLOW_CHECK(array, sz, max_size);
2350 data->intr_regs.mask = mask;
2351 data->intr_regs.regs = (u64 *)array;
2352 array = (void *)array + sz;
2353 }
2354 }
2355
2356 data->phys_addr = 0;
2357 if (type & PERF_SAMPLE_PHYS_ADDR) {
2358 data->phys_addr = *array;
2359 array++;
2360 }
2361
2362 data->cgroup = 0;
2363 if (type & PERF_SAMPLE_CGROUP) {
2364 data->cgroup = *array;
2365 array++;
2366 }
2367
2368 if (type & PERF_SAMPLE_AUX) {
2369 OVERFLOW_CHECK_u64(array);
2370 sz = *array++;
2371
2372 OVERFLOW_CHECK(array, sz, max_size);
2373
2374 if (swapped)
2375 mem_bswap_64((char *)array, sz);
2376 data->aux_sample.size = sz;
2377 data->aux_sample.data = (char *)array;
2378 array = (void *)array + sz;
2379 }
2380
2381 return 0;
2382}
2383
2384int evsel__parse_sample_timestamp(struct evsel *evsel, union perf_event *event,
2385 u64 *timestamp)
2386{
2387 u64 type = evsel->core.attr.sample_type;
2388 const __u64 *array;
2389
2390 if (!(type & PERF_SAMPLE_TIME))
2391 return -1;
2392
2393 if (event->header.type != PERF_RECORD_SAMPLE) {
2394 struct perf_sample data = {
2395 .time = -1ULL,
2396 };
2397
2398 if (!evsel->core.attr.sample_id_all)
2399 return -1;
2400 if (perf_evsel__parse_id_sample(evsel, event, &data))
2401 return -1;
2402
2403 *timestamp = data.time;
2404 return 0;
2405 }
2406
2407 array = event->sample.array;
2408
2409 if (perf_event__check_size(event, evsel->sample_size))
2410 return -EFAULT;
2411
2412 if (type & PERF_SAMPLE_IDENTIFIER)
2413 array++;
2414
2415 if (type & PERF_SAMPLE_IP)
2416 array++;
2417
2418 if (type & PERF_SAMPLE_TID)
2419 array++;
2420
2421 if (type & PERF_SAMPLE_TIME)
2422 *timestamp = *array;
2423
2424 return 0;
2425}
2426
2427struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
2428{
2429 return tep_find_field(evsel->tp_format, name);
2430}
2431
2432void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name)
2433{
2434 struct tep_format_field *field = evsel__field(evsel, name);
2435 int offset;
2436
2437 if (!field)
2438 return NULL;
2439
2440 offset = field->offset;
2441
2442 if (field->flags & TEP_FIELD_IS_DYNAMIC) {
2443 offset = *(int *)(sample->raw_data + field->offset);
2444 offset &= 0xffff;
2445 }
2446
2447 return sample->raw_data + offset;
2448}
2449
2450u64 format_field__intval(struct tep_format_field *field, struct perf_sample *sample,
2451 bool needs_swap)
2452{
2453 u64 value;
2454 void *ptr = sample->raw_data + field->offset;
2455
2456 switch (field->size) {
2457 case 1:
2458 return *(u8 *)ptr;
2459 case 2:
2460 value = *(u16 *)ptr;
2461 break;
2462 case 4:
2463 value = *(u32 *)ptr;
2464 break;
2465 case 8:
2466 memcpy(&value, ptr, sizeof(u64));
2467 break;
2468 default:
2469 return 0;
2470 }
2471
2472 if (!needs_swap)
2473 return value;
2474
2475 switch (field->size) {
2476 case 2:
2477 return bswap_16(value);
2478 case 4:
2479 return bswap_32(value);
2480 case 8:
2481 return bswap_64(value);
2482 default:
2483 return 0;
2484 }
2485
2486 return 0;
2487}
2488
2489u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name)
2490{
2491 struct tep_format_field *field = evsel__field(evsel, name);
2492
2493 if (!field)
2494 return 0;
2495
2496 return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
2497}
2498
2499bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
2500{
2501 int paranoid;
2502
2503 if ((err == ENOENT || err == ENXIO || err == ENODEV) &&
2504 evsel->core.attr.type == PERF_TYPE_HARDWARE &&
2505 evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES) {
2506
2507
2508
2509
2510
2511
2512
2513
2514 scnprintf(msg, msgsize, "%s",
2515"The cycles event is not supported, trying to fall back to cpu-clock-ticks");
2516
2517 evsel->core.attr.type = PERF_TYPE_SOFTWARE;
2518 evsel->core.attr.config = PERF_COUNT_SW_CPU_CLOCK;
2519
2520 zfree(&evsel->name);
2521 return true;
2522 } else if (err == EACCES && !evsel->core.attr.exclude_kernel &&
2523 (paranoid = perf_event_paranoid()) > 1) {
2524 const char *name = evsel__name(evsel);
2525 char *new_name;
2526 const char *sep = ":";
2527
2528
2529 if (evsel->core.attr.exclude_user)
2530 return false;
2531
2532
2533 if (strchr(name, '/') ||
2534 (strchr(name, ':') && !evsel->is_libpfm_event))
2535 sep = "";
2536
2537 if (asprintf(&new_name, "%s%su", name, sep) < 0)
2538 return false;
2539
2540 if (evsel->name)
2541 free(evsel->name);
2542 evsel->name = new_name;
2543 scnprintf(msg, msgsize, "kernel.perf_event_paranoid=%d, trying "
2544 "to fall back to excluding kernel and hypervisor "
2545 " samples", paranoid);
2546 evsel->core.attr.exclude_kernel = 1;
2547 evsel->core.attr.exclude_hv = 1;
2548
2549 return true;
2550 }
2551
2552 return false;
2553}
2554
2555static bool find_process(const char *name)
2556{
2557 size_t len = strlen(name);
2558 DIR *dir;
2559 struct dirent *d;
2560 int ret = -1;
2561
2562 dir = opendir(procfs__mountpoint());
2563 if (!dir)
2564 return false;
2565
2566
2567 while (ret && (d = readdir(dir)) != NULL) {
2568 char path[PATH_MAX];
2569 char *data;
2570 size_t size;
2571
2572 if ((d->d_type != DT_DIR) ||
2573 !strcmp(".", d->d_name) ||
2574 !strcmp("..", d->d_name))
2575 continue;
2576
2577 scnprintf(path, sizeof(path), "%s/%s/comm",
2578 procfs__mountpoint(), d->d_name);
2579
2580 if (filename__read_str(path, &data, &size))
2581 continue;
2582
2583 ret = strncmp(name, data, len);
2584 free(data);
2585 }
2586
2587 closedir(dir);
2588 return ret ? false : true;
2589}
2590
2591int evsel__open_strerror(struct evsel *evsel, struct target *target,
2592 int err, char *msg, size_t size)
2593{
2594 char sbuf[STRERR_BUFSIZE];
2595 int printed = 0, enforced = 0;
2596
2597 switch (err) {
2598 case EPERM:
2599 case EACCES:
2600 printed += scnprintf(msg + printed, size - printed,
2601 "Access to performance monitoring and observability operations is limited.\n");
2602
2603 if (!sysfs__read_int("fs/selinux/enforce", &enforced)) {
2604 if (enforced) {
2605 printed += scnprintf(msg + printed, size - printed,
2606 "Enforced MAC policy settings (SELinux) can limit access to performance\n"
2607 "monitoring and observability operations. Inspect system audit records for\n"
2608 "more perf_event access control information and adjusting the policy.\n");
2609 }
2610 }
2611
2612 if (err == EPERM)
2613 printed += scnprintf(msg, size,
2614 "No permission to enable %s event.\n\n", evsel__name(evsel));
2615
2616 return scnprintf(msg + printed, size - printed,
2617 "Consider adjusting /proc/sys/kernel/perf_event_paranoid setting to open\n"
2618 "access to performance monitoring and observability operations for processes\n"
2619 "without CAP_PERFMON, CAP_SYS_PTRACE or CAP_SYS_ADMIN Linux capability.\n"
2620 "More information can be found at 'Perf events and tool security' document:\n"
2621 "https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html\n"
2622 "perf_event_paranoid setting is %d:\n"
2623 " -1: Allow use of (almost) all events by all users\n"
2624 " Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK\n"
2625 ">= 0: Disallow raw and ftrace function tracepoint access\n"
2626 ">= 1: Disallow CPU event access\n"
2627 ">= 2: Disallow kernel profiling\n"
2628 "To make the adjusted perf_event_paranoid setting permanent preserve it\n"
2629 "in /etc/sysctl.conf (e.g. kernel.perf_event_paranoid = <setting>)",
2630 perf_event_paranoid());
2631 case ENOENT:
2632 return scnprintf(msg, size, "The %s event is not supported.", evsel__name(evsel));
2633 case EMFILE:
2634 return scnprintf(msg, size, "%s",
2635 "Too many events are opened.\n"
2636 "Probably the maximum number of open file descriptors has been reached.\n"
2637 "Hint: Try again after reducing the number of events.\n"
2638 "Hint: Try increasing the limit with 'ulimit -n <limit>'");
2639 case ENOMEM:
2640 if (evsel__has_callchain(evsel) &&
2641 access("/proc/sys/kernel/perf_event_max_stack", F_OK) == 0)
2642 return scnprintf(msg, size,
2643 "Not enough memory to setup event with callchain.\n"
2644 "Hint: Try tweaking /proc/sys/kernel/perf_event_max_stack\n"
2645 "Hint: Current value: %d", sysctl__max_stack());
2646 break;
2647 case ENODEV:
2648 if (target->cpu_list)
2649 return scnprintf(msg, size, "%s",
2650 "No such device - did you specify an out-of-range profile CPU?");
2651 break;
2652 case EOPNOTSUPP:
2653 if (evsel->core.attr.aux_output)
2654 return scnprintf(msg, size,
2655 "%s: PMU Hardware doesn't support 'aux_output' feature",
2656 evsel__name(evsel));
2657 if (evsel->core.attr.sample_period != 0)
2658 return scnprintf(msg, size,
2659 "%s: PMU Hardware doesn't support sampling/overflow-interrupts. Try 'perf stat'",
2660 evsel__name(evsel));
2661 if (evsel->core.attr.precise_ip)
2662 return scnprintf(msg, size, "%s",
2663 "\'precise\' request may not be supported. Try removing 'p' modifier.");
2664#if defined(__i386__) || defined(__x86_64__)
2665 if (evsel->core.attr.type == PERF_TYPE_HARDWARE)
2666 return scnprintf(msg, size, "%s",
2667 "No hardware sampling interrupt available.\n");
2668#endif
2669 break;
2670 case EBUSY:
2671 if (find_process("oprofiled"))
2672 return scnprintf(msg, size,
2673 "The PMU counters are busy/taken by another profiler.\n"
2674 "We found oprofile daemon running, please stop it and try again.");
2675 break;
2676 case EINVAL:
2677 if (evsel->core.attr.write_backward && perf_missing_features.write_backward)
2678 return scnprintf(msg, size, "Reading from overwrite event is not supported by this kernel.");
2679 if (perf_missing_features.clockid)
2680 return scnprintf(msg, size, "clockid feature not supported.");
2681 if (perf_missing_features.clockid_wrong)
2682 return scnprintf(msg, size, "wrong clockid (%d).", clockid);
2683 if (perf_missing_features.aux_output)
2684 return scnprintf(msg, size, "The 'aux_output' feature is not supported, update the kernel.");
2685 break;
2686 default:
2687 break;
2688 }
2689
2690 return scnprintf(msg, size,
2691 "The sys_perf_event_open() syscall returned with %d (%s) for event (%s).\n"
2692 "/bin/dmesg | grep -i perf may provide additional information.\n",
2693 err, str_error_r(err, sbuf, sizeof(sbuf)), evsel__name(evsel));
2694}
2695
2696struct perf_env *evsel__env(struct evsel *evsel)
2697{
2698 if (evsel && evsel->evlist)
2699 return evsel->evlist->env;
2700 return &perf_env;
2701}
2702
2703static int store_evsel_ids(struct evsel *evsel, struct evlist *evlist)
2704{
2705 int cpu, thread;
2706
2707 for (cpu = 0; cpu < xyarray__max_x(evsel->core.fd); cpu++) {
2708 for (thread = 0; thread < xyarray__max_y(evsel->core.fd);
2709 thread++) {
2710 int fd = FD(evsel, cpu, thread);
2711
2712 if (perf_evlist__id_add_fd(&evlist->core, &evsel->core,
2713 cpu, thread, fd) < 0)
2714 return -1;
2715 }
2716 }
2717
2718 return 0;
2719}
2720
2721int evsel__store_ids(struct evsel *evsel, struct evlist *evlist)
2722{
2723 struct perf_cpu_map *cpus = evsel->core.cpus;
2724 struct perf_thread_map *threads = evsel->core.threads;
2725
2726 if (perf_evsel__alloc_id(&evsel->core, cpus->nr, threads->nr))
2727 return -ENOMEM;
2728
2729 return store_evsel_ids(evsel, evlist);
2730}
2731