linux/tools/perf/util/evlist.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __PERF_EVLIST_H
   3#define __PERF_EVLIST_H 1
   4
   5#include <linux/compiler.h>
   6#include <linux/kernel.h>
   7#include <linux/refcount.h>
   8#include <linux/list.h>
   9#include <api/fd/array.h>
  10#include <stdio.h>
  11#include "../perf.h"
  12#include "event.h"
  13#include "evsel.h"
  14#include "mmap.h"
  15#include "util.h"
  16#include <signal.h>
  17#include <unistd.h>
  18
  19struct pollfd;
  20struct thread_map;
  21struct cpu_map;
  22struct record_opts;
  23
  24#define PERF_EVLIST__HLIST_BITS 8
  25#define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS)
  26
  27struct perf_evlist {
  28        struct list_head entries;
  29        struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
  30        int              nr_entries;
  31        int              nr_groups;
  32        int              nr_mmaps;
  33        bool             enabled;
  34        bool             has_user_cpus;
  35        size_t           mmap_len;
  36        int              id_pos;
  37        int              is_pos;
  38        u64              combined_sample_type;
  39        enum bkw_mmap_state bkw_mmap_state;
  40        struct {
  41                int     cork_fd;
  42                pid_t   pid;
  43        } workload;
  44        struct fdarray   pollfd;
  45        struct perf_mmap *mmap;
  46        struct perf_mmap *overwrite_mmap;
  47        struct thread_map *threads;
  48        struct cpu_map    *cpus;
  49        struct perf_evsel *selected;
  50        struct events_stats stats;
  51        struct perf_env *env;
  52        void (*trace_event_sample_raw)(struct perf_evlist *evlist,
  53                                       union perf_event *event,
  54                                       struct perf_sample *sample);
  55        u64             first_sample_time;
  56        u64             last_sample_time;
  57        struct {
  58                pthread_t               th;
  59                volatile int            done;
  60        } thread;
  61};
  62
  63struct perf_evsel_str_handler {
  64        const char *name;
  65        void       *handler;
  66};
  67
  68struct perf_evlist *perf_evlist__new(void);
  69struct perf_evlist *perf_evlist__new_default(void);
  70struct perf_evlist *perf_evlist__new_dummy(void);
  71void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus,
  72                       struct thread_map *threads);
  73void perf_evlist__exit(struct perf_evlist *evlist);
  74void perf_evlist__delete(struct perf_evlist *evlist);
  75
  76void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry);
  77void perf_evlist__remove(struct perf_evlist *evlist, struct perf_evsel *evsel);
  78
  79int __perf_evlist__add_default(struct perf_evlist *evlist, bool precise);
  80
  81static inline int perf_evlist__add_default(struct perf_evlist *evlist)
  82{
  83        return __perf_evlist__add_default(evlist, true);
  84}
  85
  86int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
  87                                     struct perf_event_attr *attrs, size_t nr_attrs);
  88
  89#define perf_evlist__add_default_attrs(evlist, array) \
  90        __perf_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))
  91
  92int perf_evlist__add_dummy(struct perf_evlist *evlist);
  93
  94int perf_evlist__add_sb_event(struct perf_evlist **evlist,
  95                              struct perf_event_attr *attr,
  96                              perf_evsel__sb_cb_t cb,
  97                              void *data);
  98int perf_evlist__start_sb_thread(struct perf_evlist *evlist,
  99                                 struct target *target);
 100void perf_evlist__stop_sb_thread(struct perf_evlist *evlist);
 101
 102int perf_evlist__add_newtp(struct perf_evlist *evlist,
 103                           const char *sys, const char *name, void *handler);
 104
 105void __perf_evlist__set_sample_bit(struct perf_evlist *evlist,
 106                                   enum perf_event_sample_format bit);
 107void __perf_evlist__reset_sample_bit(struct perf_evlist *evlist,
 108                                     enum perf_event_sample_format bit);
 109
 110#define perf_evlist__set_sample_bit(evlist, bit) \
 111        __perf_evlist__set_sample_bit(evlist, PERF_SAMPLE_##bit)
 112
 113#define perf_evlist__reset_sample_bit(evlist, bit) \
 114        __perf_evlist__reset_sample_bit(evlist, PERF_SAMPLE_##bit)
 115
 116int perf_evlist__set_tp_filter(struct perf_evlist *evlist, const char *filter);
 117int perf_evlist__set_tp_filter_pid(struct perf_evlist *evlist, pid_t pid);
 118int perf_evlist__set_tp_filter_pids(struct perf_evlist *evlist, size_t npids, pid_t *pids);
 119
 120struct perf_evsel *
 121perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id);
 122
 123struct perf_evsel *
 124perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
 125                                     const char *name);
 126
 127void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
 128                         int cpu, int thread, u64 id);
 129int perf_evlist__id_add_fd(struct perf_evlist *evlist,
 130                           struct perf_evsel *evsel,
 131                           int cpu, int thread, int fd);
 132
 133int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);
 134int perf_evlist__alloc_pollfd(struct perf_evlist *evlist);
 135int perf_evlist__filter_pollfd(struct perf_evlist *evlist, short revents_and_mask);
 136
 137int perf_evlist__poll(struct perf_evlist *evlist, int timeout);
 138
 139struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);
 140struct perf_evsel *perf_evlist__id2evsel_strict(struct perf_evlist *evlist,
 141                                                u64 id);
 142
 143struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id);
 144
 145void perf_evlist__toggle_bkw_mmap(struct perf_evlist *evlist, enum bkw_mmap_state state);
 146
 147void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx);
 148
 149int perf_evlist__open(struct perf_evlist *evlist);
 150void perf_evlist__close(struct perf_evlist *evlist);
 151
 152struct callchain_param;
 153
 154void perf_evlist__set_id_pos(struct perf_evlist *evlist);
 155bool perf_can_sample_identifier(void);
 156bool perf_can_record_switch_events(void);
 157bool perf_can_record_cpu_wide(void);
 158void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts,
 159                         struct callchain_param *callchain);
 160int record_opts__config(struct record_opts *opts);
 161
 162int perf_evlist__prepare_workload(struct perf_evlist *evlist,
 163                                  struct target *target,
 164                                  const char *argv[], bool pipe_output,
 165                                  void (*exec_error)(int signo, siginfo_t *info,
 166                                                     void *ucontext));
 167int perf_evlist__start_workload(struct perf_evlist *evlist);
 168
 169struct option;
 170
 171int __perf_evlist__parse_mmap_pages(unsigned int *mmap_pages, const char *str);
 172int perf_evlist__parse_mmap_pages(const struct option *opt,
 173                                  const char *str,
 174                                  int unset);
 175
 176unsigned long perf_event_mlock_kb_in_pages(void);
 177
 178int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
 179                         unsigned int auxtrace_pages,
 180                         bool auxtrace_overwrite, int nr_cblocks,
 181                         int affinity, int flush, int comp_level);
 182int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages);
 183void perf_evlist__munmap(struct perf_evlist *evlist);
 184
 185size_t perf_evlist__mmap_size(unsigned long pages);
 186
 187void perf_evlist__disable(struct perf_evlist *evlist);
 188void perf_evlist__enable(struct perf_evlist *evlist);
 189void perf_evlist__toggle_enable(struct perf_evlist *evlist);
 190
 191int perf_evlist__enable_event_idx(struct perf_evlist *evlist,
 192                                  struct perf_evsel *evsel, int idx);
 193
 194void perf_evlist__set_selected(struct perf_evlist *evlist,
 195                               struct perf_evsel *evsel);
 196
 197void perf_evlist__set_maps(struct perf_evlist *evlist, struct cpu_map *cpus,
 198                           struct thread_map *threads);
 199int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target);
 200int perf_evlist__apply_filters(struct perf_evlist *evlist, struct perf_evsel **err_evsel);
 201
 202void __perf_evlist__set_leader(struct list_head *list);
 203void perf_evlist__set_leader(struct perf_evlist *evlist);
 204
 205u64 perf_evlist__read_format(struct perf_evlist *evlist);
 206u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist);
 207u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist);
 208u64 perf_evlist__combined_branch_type(struct perf_evlist *evlist);
 209bool perf_evlist__sample_id_all(struct perf_evlist *evlist);
 210u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
 211
 212int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
 213                              struct perf_sample *sample);
 214
 215int perf_evlist__parse_sample_timestamp(struct perf_evlist *evlist,
 216                                        union perf_event *event,
 217                                        u64 *timestamp);
 218
 219bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
 220bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
 221bool perf_evlist__valid_read_format(struct perf_evlist *evlist);
 222
 223void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
 224                                   struct list_head *list);
 225
 226static inline bool perf_evlist__empty(struct perf_evlist *evlist)
 227{
 228        return list_empty(&evlist->entries);
 229}
 230
 231static inline struct perf_evsel *perf_evlist__first(struct perf_evlist *evlist)
 232{
 233        return list_entry(evlist->entries.next, struct perf_evsel, node);
 234}
 235
 236static inline struct perf_evsel *perf_evlist__last(struct perf_evlist *evlist)
 237{
 238        return list_entry(evlist->entries.prev, struct perf_evsel, node);
 239}
 240
 241size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp);
 242
 243int perf_evlist__strerror_open(struct perf_evlist *evlist, int err, char *buf, size_t size);
 244int perf_evlist__strerror_mmap(struct perf_evlist *evlist, int err, char *buf, size_t size);
 245
 246bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char *str);
 247void perf_evlist__to_front(struct perf_evlist *evlist,
 248                           struct perf_evsel *move_evsel);
 249
 250/**
 251 * __evlist__for_each_entry - iterate thru all the evsels
 252 * @list: list_head instance to iterate
 253 * @evsel: struct evsel iterator
 254 */
 255#define __evlist__for_each_entry(list, evsel) \
 256        list_for_each_entry(evsel, list, node)
 257
 258/**
 259 * evlist__for_each_entry - iterate thru all the evsels
 260 * @evlist: evlist instance to iterate
 261 * @evsel: struct evsel iterator
 262 */
 263#define evlist__for_each_entry(evlist, evsel) \
 264        __evlist__for_each_entry(&(evlist)->entries, evsel)
 265
 266/**
 267 * __evlist__for_each_entry_continue - continue iteration thru all the evsels
 268 * @list: list_head instance to iterate
 269 * @evsel: struct evsel iterator
 270 */
 271#define __evlist__for_each_entry_continue(list, evsel) \
 272        list_for_each_entry_continue(evsel, list, node)
 273
 274/**
 275 * evlist__for_each_entry_continue - continue iteration thru all the evsels
 276 * @evlist: evlist instance to iterate
 277 * @evsel: struct evsel iterator
 278 */
 279#define evlist__for_each_entry_continue(evlist, evsel) \
 280        __evlist__for_each_entry_continue(&(evlist)->entries, evsel)
 281
 282/**
 283 * __evlist__for_each_entry_reverse - iterate thru all the evsels in reverse order
 284 * @list: list_head instance to iterate
 285 * @evsel: struct evsel iterator
 286 */
 287#define __evlist__for_each_entry_reverse(list, evsel) \
 288        list_for_each_entry_reverse(evsel, list, node)
 289
 290/**
 291 * evlist__for_each_entry_reverse - iterate thru all the evsels in reverse order
 292 * @evlist: evlist instance to iterate
 293 * @evsel: struct evsel iterator
 294 */
 295#define evlist__for_each_entry_reverse(evlist, evsel) \
 296        __evlist__for_each_entry_reverse(&(evlist)->entries, evsel)
 297
 298/**
 299 * __evlist__for_each_entry_safe - safely iterate thru all the evsels
 300 * @list: list_head instance to iterate
 301 * @tmp: struct evsel temp iterator
 302 * @evsel: struct evsel iterator
 303 */
 304#define __evlist__for_each_entry_safe(list, tmp, evsel) \
 305        list_for_each_entry_safe(evsel, tmp, list, node)
 306
 307/**
 308 * evlist__for_each_entry_safe - safely iterate thru all the evsels
 309 * @evlist: evlist instance to iterate
 310 * @evsel: struct evsel iterator
 311 * @tmp: struct evsel temp iterator
 312 */
 313#define evlist__for_each_entry_safe(evlist, tmp, evsel) \
 314        __evlist__for_each_entry_safe(&(evlist)->entries, tmp, evsel)
 315
 316void perf_evlist__set_tracking_event(struct perf_evlist *evlist,
 317                                     struct perf_evsel *tracking_evsel);
 318
 319struct perf_evsel *
 320perf_evlist__find_evsel_by_str(struct perf_evlist *evlist, const char *str);
 321
 322struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist,
 323                                            union perf_event *event);
 324
 325bool perf_evlist__exclude_kernel(struct perf_evlist *evlist);
 326
 327void perf_evlist__force_leader(struct perf_evlist *evlist);
 328
 329struct perf_evsel *perf_evlist__reset_weak_group(struct perf_evlist *evlist,
 330                                                 struct perf_evsel *evsel);
 331#endif /* __PERF_EVLIST_H */
 332