1 #ifndef __PERF_EVSEL_H 2 #define __PERF_EVSEL_H 1 3 4 #include <linux/list.h> 5 #include <stdbool.h> 6 #include <stddef.h> 7 #include <linux/perf_event.h> 8 #include "types.h" 9 #include "xyarray.h" 10 #include "cgroup.h" 11 #include "hist.h" 12 13 struct perf_counts_values { 14 union { 15 struct { 16 u64 val; 17 u64 ena; 18 u64 run; 19 }; 20 u64 values[3]; 21 }; 22 }; 23 24 struct perf_counts { 25 s8 scaled; 26 struct perf_counts_values aggr; 27 struct perf_counts_values cpu[]; 28 }; 29 30 struct perf_evsel; 31 32 /* 33 * Per fd, to map back from PERF_SAMPLE_ID to evsel, only used when there are 34 * more than one entry in the evlist. 35 */ 36 struct perf_sample_id { 37 struct hlist_node node; 38 u64 id; 39 struct perf_evsel *evsel; 40 }; 41 42 /** struct perf_evsel - event selector 43 * 44 * @name - Can be set to retain the original event name passed by the user, 45 * so that when showing results in tools such as 'perf stat', we 46 * show the name used, not some alias. 47 */ 48 struct perf_evsel { 49 struct list_head node; 50 struct perf_event_attr attr; 51 char *filter; 52 struct xyarray *fd; 53 struct xyarray *sample_id; 54 u64 *id; 55 struct perf_counts *counts; 56 struct perf_counts *prev_raw_counts; 57 int idx; 58 u32 ids; 59 struct hists hists; 60 char *name; 61 struct event_format *tp_format; 62 union { 63 void *priv; 64 off_t id_offset; 65 }; 66 struct cgroup_sel *cgrp; 67 struct { 68 void *func; 69 void *data; 70 } handler; 71 struct cpu_map *cpus; 72 unsigned int sample_size; 73 bool supported; 74 bool needs_swap; 75 /* parse modifier helper */ 76 int exclude_GH; 77 int nr_members; 78 struct perf_evsel *leader; 79 char *group_name; 80 }; 81 82 #define hists_to_evsel(h) container_of(h, struct perf_evsel, hists) 83 84 struct cpu_map; 85 struct thread_map; 86 struct perf_evlist; 87 struct perf_record_opts; 88 89 struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx); 90 struct perf_evsel *perf_evsel__newtp(const char *sys, const char *name, int idx); 91 92 struct event_format *event_format__new(const char *sys, const char *name); 93 94 void perf_evsel__init(struct perf_evsel *evsel, 95 struct perf_event_attr *attr, int idx); 96 void perf_evsel__exit(struct perf_evsel *evsel); 97 void perf_evsel__delete(struct perf_evsel *evsel); 98 99 void perf_evsel__config(struct perf_evsel *evsel, 100 struct perf_record_opts *opts); 101 102 bool perf_evsel__is_cache_op_valid(u8 type, u8 op); 103 104 #define PERF_EVSEL__MAX_ALIASES 8 105 106 extern const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX] 107 [PERF_EVSEL__MAX_ALIASES]; 108 extern const char *perf_evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX] 109 [PERF_EVSEL__MAX_ALIASES]; 110 extern const char *perf_evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX] 111 [PERF_EVSEL__MAX_ALIASES]; 112 extern const char *perf_evsel__hw_names[PERF_COUNT_HW_MAX]; 113 extern const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX]; 114 int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, 115 char *bf, size_t size); 116 const char *perf_evsel__name(struct perf_evsel *evsel); 117 const char *perf_evsel__group_name(struct perf_evsel *evsel); 118 int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size); 119 120 int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads); 121 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads); 122 int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus); 123 void perf_evsel__free_fd(struct perf_evsel *evsel); 124 void perf_evsel__free_id(struct perf_evsel *evsel); 125 void perf_evsel__free_counts(struct perf_evsel *evsel); 126 void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); 127 128 void __perf_evsel__set_sample_bit(struct perf_evsel *evsel, 129 enum perf_event_sample_format bit); 130 void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel, 131 enum perf_event_sample_format bit); 132 133 #define perf_evsel__set_sample_bit(evsel, bit) \ 134 __perf_evsel__set_sample_bit(evsel, PERF_SAMPLE_##bit) 135 136 #define perf_evsel__reset_sample_bit(evsel, bit) \ 137 __perf_evsel__reset_sample_bit(evsel, PERF_SAMPLE_##bit) 138 139 void perf_evsel__set_sample_id(struct perf_evsel *evsel); 140 141 int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads, 142 const char *filter); 143 144 int perf_evsel__open_per_cpu(struct perf_evsel *evsel, 145 struct cpu_map *cpus); 146 int perf_evsel__open_per_thread(struct perf_evsel *evsel, 147 struct thread_map *threads); 148 int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, 149 struct thread_map *threads); 150 void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads); 151 152 struct perf_sample; 153 154 void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample, 155 const char *name); 156 u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample, 157 const char *name); 158 159 static inline char *perf_evsel__strval(struct perf_evsel *evsel, 160 struct perf_sample *sample, 161 const char *name) 162 { 163 return perf_evsel__rawptr(evsel, sample, name); 164 } 165 166 struct format_field; 167 168 struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name); 169 170 #define perf_evsel__match(evsel, t, c) \ 171 (evsel->attr.type == PERF_TYPE_##t && \ 172 evsel->attr.config == PERF_COUNT_##c) 173 174 static inline bool perf_evsel__match2(struct perf_evsel *e1, 175 struct perf_evsel *e2) 176 { 177 return (e1->attr.type == e2->attr.type) && 178 (e1->attr.config == e2->attr.config); 179 } 180 181 int __perf_evsel__read_on_cpu(struct perf_evsel *evsel, 182 int cpu, int thread, bool scale); 183 184 /** 185 * perf_evsel__read_on_cpu - Read out the results on a CPU and thread 186 * 187 * @evsel - event selector to read value 188 * @cpu - CPU of interest 189 * @thread - thread of interest 190 */ 191 static inline int perf_evsel__read_on_cpu(struct perf_evsel *evsel, 192 int cpu, int thread) 193 { 194 return __perf_evsel__read_on_cpu(evsel, cpu, thread, false); 195 } 196 197 /** 198 * perf_evsel__read_on_cpu_scaled - Read out the results on a CPU and thread, scaled 199 * 200 * @evsel - event selector to read value 201 * @cpu - CPU of interest 202 * @thread - thread of interest 203 */ 204 static inline int perf_evsel__read_on_cpu_scaled(struct perf_evsel *evsel, 205 int cpu, int thread) 206 { 207 return __perf_evsel__read_on_cpu(evsel, cpu, thread, true); 208 } 209 210 int __perf_evsel__read(struct perf_evsel *evsel, int ncpus, int nthreads, 211 bool scale); 212 213 /** 214 * perf_evsel__read - Read the aggregate results on all CPUs 215 * 216 * @evsel - event selector to read value 217 * @ncpus - Number of cpus affected, from zero 218 * @nthreads - Number of threads affected, from zero 219 */ 220 static inline int perf_evsel__read(struct perf_evsel *evsel, 221 int ncpus, int nthreads) 222 { 223 return __perf_evsel__read(evsel, ncpus, nthreads, false); 224 } 225 226 /** 227 * perf_evsel__read_scaled - Read the aggregate results on all CPUs, scaled 228 * 229 * @evsel - event selector to read value 230 * @ncpus - Number of cpus affected, from zero 231 * @nthreads - Number of threads affected, from zero 232 */ 233 static inline int perf_evsel__read_scaled(struct perf_evsel *evsel, 234 int ncpus, int nthreads) 235 { 236 return __perf_evsel__read(evsel, ncpus, nthreads, true); 237 } 238 239 void hists__init(struct hists *hists); 240 241 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event, 242 struct perf_sample *sample); 243 244 static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel) 245 { 246 return list_entry(evsel->node.next, struct perf_evsel, node); 247 } 248 249 static inline bool perf_evsel__is_group_leader(const struct perf_evsel *evsel) 250 { 251 return evsel->leader == evsel; 252 } 253 254 struct perf_attr_details { 255 bool freq; 256 bool verbose; 257 bool event_group; 258 }; 259 260 int perf_evsel__fprintf(struct perf_evsel *evsel, 261 struct perf_attr_details *details, FILE *fp); 262 263 bool perf_evsel__fallback(struct perf_evsel *evsel, int err, 264 char *msg, size_t msgsize); 265 int perf_evsel__open_strerror(struct perf_evsel *evsel, 266 struct perf_target *target, 267 int err, char *msg, size_t size); 268 269 static inline int perf_evsel__group_idx(struct perf_evsel *evsel) 270 { 271 return evsel->idx - evsel->leader->idx; 272 } 273 274 #define for_each_group_member(_evsel, _leader) \ 275 for ((_evsel) = list_entry((_leader)->node.next, struct perf_evsel, node); \ 276 (_evsel) && (_evsel)->leader == (_leader); \ 277 (_evsel) = list_entry((_evsel)->node.next, struct perf_evsel, node)) 278 279 #endif /* __PERF_EVSEL_H */ 280