1
2#ifndef __PERF_EVSEL_H
3#define __PERF_EVSEL_H 1
4
5#include <linux/list.h>
6#include <stdbool.h>
7#include <sys/types.h>
8#include <linux/perf_event.h>
9#include <linux/types.h>
10#include <internal/evsel.h>
11#include <perf/evsel.h>
12#include "symbol_conf.h"
13#include <internal/cpumap.h>
14
15struct bpf_object;
16struct cgroup;
17struct perf_counts;
18struct perf_stat_evsel;
19union perf_event;
20struct bpf_counter_ops;
21struct target;
22struct hashmap;
23
24typedef int (evsel__sb_cb_t)(union perf_event *event, void *data);
25
26enum perf_tool_event {
27 PERF_TOOL_NONE = 0,
28 PERF_TOOL_DURATION_TIME = 1,
29};
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46struct evsel {
47 struct perf_evsel core;
48 struct evlist *evlist;
49 off_t id_offset;
50 int idx;
51 int id_pos;
52 int is_pos;
53 unsigned int sample_size;
54
55
56
57
58
59
60 struct {
61 char *name;
62 char *group_name;
63 const char *pmu_name;
64 struct tep_event *tp_format;
65 char *filter;
66 unsigned long max_events;
67 double scale;
68 const char *unit;
69 struct cgroup *cgrp;
70 enum perf_tool_event tool_event;
71
72 int exclude_GH;
73 int sample_read;
74 bool snapshot;
75 bool per_pkg;
76 bool percore;
77 bool precise_max;
78 bool use_uncore_alias;
79 bool is_libpfm_event;
80 bool auto_merge_stats;
81 bool collect_stat;
82 bool weak_group;
83 int bpf_fd;
84 struct bpf_object *bpf_obj;
85 };
86
87
88
89
90
91 const char * metric_expr;
92 const char * metric_name;
93 struct evsel **metric_events;
94 struct evsel *metric_leader;
95
96 void *handler;
97 struct perf_counts *counts;
98 struct perf_counts *prev_raw_counts;
99 unsigned long nr_events_printed;
100 struct perf_stat_evsel *stats;
101 void *priv;
102 u64 db_id;
103 bool uniquified_name;
104 bool supported;
105 bool needs_swap;
106 bool disabled;
107 bool no_aux_samples;
108 bool immediate;
109 bool tracking;
110 bool ignore_missing_thread;
111 bool forced_leader;
112 bool cmdline_group_boundary;
113 bool merged_stat;
114 bool reset_group;
115 bool errored;
116 struct hashmap *per_pkg_mask;
117 struct evsel *leader;
118 struct list_head config_terms;
119 int err;
120 int cpu_iter;
121 struct {
122 evsel__sb_cb_t *cb;
123 void *data;
124 } side_band;
125
126
127
128
129
130
131
132 __u64 synth_sample_type;
133 struct list_head bpf_counter_list;
134 struct bpf_counter_ops *bpf_counter_ops;
135};
136
137struct perf_missing_features {
138 bool sample_id_all;
139 bool exclude_guest;
140 bool mmap2;
141 bool cloexec;
142 bool clockid;
143 bool clockid_wrong;
144 bool lbr_flags;
145 bool write_backward;
146 bool group_read;
147 bool ksymbol;
148 bool bpf;
149 bool aux_output;
150 bool branch_hw_idx;
151 bool cgroup;
152 bool data_page_size;
153 bool code_page_size;
154 bool weight_struct;
155};
156
157extern struct perf_missing_features perf_missing_features;
158
159struct perf_cpu_map;
160struct target;
161struct thread_map;
162struct record_opts;
163
164static inline struct perf_cpu_map *evsel__cpus(struct evsel *evsel)
165{
166 return perf_evsel__cpus(&evsel->core);
167}
168
169static inline int evsel__nr_cpus(struct evsel *evsel)
170{
171 return evsel__cpus(evsel)->nr;
172}
173
174void perf_counts_values__scale(struct perf_counts_values *count,
175 bool scale, s8 *pscaled);
176
177void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread,
178 struct perf_counts_values *count);
179
180int evsel__object_config(size_t object_size,
181 int (*init)(struct evsel *evsel),
182 void (*fini)(struct evsel *evsel));
183
184struct perf_pmu *evsel__find_pmu(struct evsel *evsel);
185bool evsel__is_aux_event(struct evsel *evsel);
186
187struct evsel *evsel__new_idx(struct perf_event_attr *attr, int idx);
188
189static inline struct evsel *evsel__new(struct perf_event_attr *attr)
190{
191 return evsel__new_idx(attr, 0);
192}
193
194struct evsel *evsel__clone(struct evsel *orig);
195struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
196
197
198
199
200static inline struct evsel *evsel__newtp(const char *sys, const char *name)
201{
202 return evsel__newtp_idx(sys, name, 0);
203}
204
205struct evsel *evsel__new_cycles(bool precise);
206
207struct tep_event *event_format__new(const char *sys, const char *name);
208
209void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
210void evsel__exit(struct evsel *evsel);
211void evsel__delete(struct evsel *evsel);
212
213struct callchain_param;
214
215void evsel__config(struct evsel *evsel, struct record_opts *opts,
216 struct callchain_param *callchain);
217void evsel__config_callchain(struct evsel *evsel, struct record_opts *opts,
218 struct callchain_param *callchain);
219
220int __evsel__sample_size(u64 sample_type);
221void evsel__calc_id_pos(struct evsel *evsel);
222
223bool evsel__is_cache_op_valid(u8 type, u8 op);
224
225#define EVSEL__MAX_ALIASES 8
226
227extern const char *evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX][EVSEL__MAX_ALIASES];
228extern const char *evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX][EVSEL__MAX_ALIASES];
229extern const char *evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX][EVSEL__MAX_ALIASES];
230extern const char *evsel__hw_names[PERF_COUNT_HW_MAX];
231extern const char *evsel__sw_names[PERF_COUNT_SW_MAX];
232int __evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, char *bf, size_t size);
233const char *evsel__name(struct evsel *evsel);
234
235const char *evsel__group_name(struct evsel *evsel);
236int evsel__group_desc(struct evsel *evsel, char *buf, size_t size);
237
238void __evsel__set_sample_bit(struct evsel *evsel, enum perf_event_sample_format bit);
239void __evsel__reset_sample_bit(struct evsel *evsel, enum perf_event_sample_format bit);
240
241#define evsel__set_sample_bit(evsel, bit) \
242 __evsel__set_sample_bit(evsel, PERF_SAMPLE_##bit)
243
244#define evsel__reset_sample_bit(evsel, bit) \
245 __evsel__reset_sample_bit(evsel, PERF_SAMPLE_##bit)
246
247void evsel__set_sample_id(struct evsel *evsel, bool use_sample_identifier);
248
249void arch_evsel__set_sample_weight(struct evsel *evsel);
250
251int evsel__set_filter(struct evsel *evsel, const char *filter);
252int evsel__append_tp_filter(struct evsel *evsel, const char *filter);
253int evsel__append_addr_filter(struct evsel *evsel, const char *filter);
254int evsel__enable_cpu(struct evsel *evsel, int cpu);
255int evsel__enable(struct evsel *evsel);
256int evsel__disable(struct evsel *evsel);
257int evsel__disable_cpu(struct evsel *evsel, int cpu);
258
259int evsel__open_per_cpu(struct evsel *evsel, struct perf_cpu_map *cpus, int cpu);
260int evsel__open_per_thread(struct evsel *evsel, struct perf_thread_map *threads);
261int evsel__open(struct evsel *evsel, struct perf_cpu_map *cpus,
262 struct perf_thread_map *threads);
263void evsel__close(struct evsel *evsel);
264
265struct perf_sample;
266
267void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
268u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
269
270static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sample, const char *name)
271{
272 return evsel__rawptr(evsel, sample, name);
273}
274
275struct tep_format_field;
276
277u64 format_field__intval(struct tep_format_field *field, struct perf_sample *sample, bool needs_swap);
278
279struct tep_format_field *evsel__field(struct evsel *evsel, const char *name);
280
281#define evsel__match(evsel, t, c) \
282 (evsel->core.attr.type == PERF_TYPE_##t && \
283 evsel->core.attr.config == PERF_COUNT_##c)
284
285static inline bool evsel__match2(struct evsel *e1, struct evsel *e2)
286{
287 return (e1->core.attr.type == e2->core.attr.type) &&
288 (e1->core.attr.config == e2->core.attr.config);
289}
290
291int evsel__read_counter(struct evsel *evsel, int cpu, int thread);
292
293int __evsel__read_on_cpu(struct evsel *evsel, int cpu, int thread, bool scale);
294
295
296
297
298
299
300
301
302static inline int evsel__read_on_cpu(struct evsel *evsel, int cpu, int thread)
303{
304 return __evsel__read_on_cpu(evsel, cpu, thread, false);
305}
306
307
308
309
310
311
312
313
314static inline int evsel__read_on_cpu_scaled(struct evsel *evsel, int cpu, int thread)
315{
316 return __evsel__read_on_cpu(evsel, cpu, thread, true);
317}
318
319int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
320 struct perf_sample *sample);
321
322int evsel__parse_sample_timestamp(struct evsel *evsel, union perf_event *event,
323 u64 *timestamp);
324
325static inline struct evsel *evsel__next(struct evsel *evsel)
326{
327 return list_entry(evsel->core.node.next, struct evsel, core.node);
328}
329
330static inline struct evsel *evsel__prev(struct evsel *evsel)
331{
332 return list_entry(evsel->core.node.prev, struct evsel, core.node);
333}
334
335
336
337
338
339
340
341
342static inline bool evsel__is_group_leader(const struct evsel *evsel)
343{
344 return evsel->leader == evsel;
345}
346
347
348
349
350
351
352
353
354
355static inline bool evsel__is_group_event(struct evsel *evsel)
356{
357 if (!symbol_conf.event_group)
358 return false;
359
360 return evsel__is_group_leader(evsel) && evsel->core.nr_members > 1;
361}
362
363bool evsel__is_function_event(struct evsel *evsel);
364
365static inline bool evsel__is_bpf_output(struct evsel *evsel)
366{
367 return evsel__match(evsel, SOFTWARE, SW_BPF_OUTPUT);
368}
369
370static inline bool evsel__is_clock(struct evsel *evsel)
371{
372 return evsel__match(evsel, SOFTWARE, SW_CPU_CLOCK) ||
373 evsel__match(evsel, SOFTWARE, SW_TASK_CLOCK);
374}
375
376bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize);
377int evsel__open_strerror(struct evsel *evsel, struct target *target,
378 int err, char *msg, size_t size);
379
380static inline int evsel__group_idx(struct evsel *evsel)
381{
382 return evsel->idx - evsel->leader->idx;
383}
384
385
386#define for_each_group_member(_evsel, _leader) \
387for ((_evsel) = list_entry((_leader)->core.node.next, struct evsel, core.node); \
388 (_evsel) && (_evsel)->leader == (_leader); \
389 (_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node))
390
391
392#define for_each_group_evsel(_evsel, _leader) \
393for ((_evsel) = _leader; \
394 (_evsel) && (_evsel)->leader == (_leader); \
395 (_evsel) = list_entry((_evsel)->core.node.next, struct evsel, core.node))
396
397static inline bool evsel__has_branch_callstack(const struct evsel *evsel)
398{
399 return evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_CALL_STACK;
400}
401
402static inline bool evsel__has_branch_hw_idx(const struct evsel *evsel)
403{
404 return evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX;
405}
406
407static inline bool evsel__has_callchain(const struct evsel *evsel)
408{
409
410
411
412
413 return evsel->core.attr.sample_type & PERF_SAMPLE_CALLCHAIN ||
414 evsel->synth_sample_type & PERF_SAMPLE_CALLCHAIN;
415}
416
417static inline bool evsel__has_br_stack(const struct evsel *evsel)
418{
419
420
421
422
423 return evsel->core.attr.sample_type & PERF_SAMPLE_BRANCH_STACK ||
424 evsel->synth_sample_type & PERF_SAMPLE_BRANCH_STACK;
425}
426
427static inline bool evsel__is_dummy_event(struct evsel *evsel)
428{
429 return (evsel->core.attr.type == PERF_TYPE_SOFTWARE) &&
430 (evsel->core.attr.config == PERF_COUNT_SW_DUMMY);
431}
432
433struct perf_env *evsel__env(struct evsel *evsel);
434
435int evsel__store_ids(struct evsel *evsel, struct evlist *evlist);
436
437void evsel__zero_per_pkg(struct evsel *evsel);
438#endif
439