linux/tools/perf/util/evlist.h
<<
>>
Prefs
   1#ifndef __PERF_EVLIST_H
   2#define __PERF_EVLIST_H 1
   3
   4#include <linux/atomic.h>
   5#include <linux/list.h>
   6#include <api/fd/array.h>
   7#include <stdio.h>
   8#include "../perf.h"
   9#include "event.h"
  10#include "evsel.h"
  11#include "util.h"
  12#include "auxtrace.h"
  13#include <unistd.h>
  14
  15struct pollfd;
  16struct thread_map;
  17struct cpu_map;
  18struct record_opts;
  19
  20#define PERF_EVLIST__HLIST_BITS 8
  21#define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS)
  22
  23/**
  24 * struct perf_mmap - perf's ring buffer mmap details
  25 *
  26 * @refcnt - e.g. code using PERF_EVENT_IOC_SET_OUTPUT to share this
  27 */
  28struct perf_mmap {
  29        void             *base;
  30        int              mask;
  31        atomic_t         refcnt;
  32        u64              prev;
  33        struct auxtrace_mmap auxtrace_mmap;
  34        char             event_copy[PERF_SAMPLE_MAX_SIZE] __attribute__((aligned(8)));
  35};
  36
  37struct perf_evlist {
  38        struct list_head entries;
  39        struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
  40        int              nr_entries;
  41        int              nr_groups;
  42        int              nr_mmaps;
  43        bool             overwrite;
  44        bool             enabled;
  45        bool             has_user_cpus;
  46        size_t           mmap_len;
  47        int              id_pos;
  48        int              is_pos;
  49        u64              combined_sample_type;
  50        struct {
  51                int     cork_fd;
  52                pid_t   pid;
  53        } workload;
  54        struct fdarray   pollfd;
  55        struct perf_mmap *mmap;
  56        struct thread_map *threads;
  57        struct cpu_map    *cpus;
  58        struct perf_evsel *selected;
  59        struct events_stats stats;
  60        struct perf_env *env;
  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);
  78int perf_evlist__add_default(struct perf_evlist *evlist);
  79int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
  80                                     struct perf_event_attr *attrs, size_t nr_attrs);
  81
  82#define perf_evlist__add_default_attrs(evlist, array) \
  83        __perf_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))
  84
  85int perf_evlist__add_dummy(struct perf_evlist *evlist);
  86
  87int perf_evlist__add_newtp(struct perf_evlist *evlist,
  88                           const char *sys, const char *name, void *handler);
  89
  90int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter);
  91int perf_evlist__set_filter_pid(struct perf_evlist *evlist, pid_t pid);
  92int perf_evlist__set_filter_pids(struct perf_evlist *evlist, size_t npids, pid_t *pids);
  93
  94struct perf_evsel *
  95perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id);
  96
  97struct perf_evsel *
  98perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
  99                                     const char *name);
 100
 101void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
 102                         int cpu, int thread, u64 id);
 103int perf_evlist__id_add_fd(struct perf_evlist *evlist,
 104                           struct perf_evsel *evsel,
 105                           int cpu, int thread, int fd);
 106
 107int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);
 108int perf_evlist__alloc_pollfd(struct perf_evlist *evlist);
 109int perf_evlist__filter_pollfd(struct perf_evlist *evlist, short revents_and_mask);
 110
 111int perf_evlist__poll(struct perf_evlist *evlist, int timeout);
 112
 113struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);
 114struct perf_evsel *perf_evlist__id2evsel_strict(struct perf_evlist *evlist,
 115                                                u64 id);
 116
 117struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id);
 118
 119union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx);
 120
 121void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx);
 122
 123int perf_evlist__open(struct perf_evlist *evlist);
 124void perf_evlist__close(struct perf_evlist *evlist);
 125
 126void perf_evlist__set_id_pos(struct perf_evlist *evlist);
 127bool perf_can_sample_identifier(void);
 128bool perf_can_record_switch_events(void);
 129bool perf_can_record_cpu_wide(void);
 130void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts);
 131int record_opts__config(struct record_opts *opts);
 132
 133int perf_evlist__prepare_workload(struct perf_evlist *evlist,
 134                                  struct target *target,
 135                                  const char *argv[], bool pipe_output,
 136                                  void (*exec_error)(int signo, siginfo_t *info,
 137                                                     void *ucontext));
 138int perf_evlist__start_workload(struct perf_evlist *evlist);
 139
 140struct option;
 141
 142int __perf_evlist__parse_mmap_pages(unsigned int *mmap_pages, const char *str);
 143int perf_evlist__parse_mmap_pages(const struct option *opt,
 144                                  const char *str,
 145                                  int unset);
 146
 147int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
 148                         bool overwrite, unsigned int auxtrace_pages,
 149                         bool auxtrace_overwrite);
 150int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
 151                      bool overwrite);
 152void perf_evlist__munmap(struct perf_evlist *evlist);
 153
 154void perf_evlist__disable(struct perf_evlist *evlist);
 155void perf_evlist__enable(struct perf_evlist *evlist);
 156void perf_evlist__toggle_enable(struct perf_evlist *evlist);
 157
 158int perf_evlist__enable_event_idx(struct perf_evlist *evlist,
 159                                  struct perf_evsel *evsel, int idx);
 160
 161void perf_evlist__set_selected(struct perf_evlist *evlist,
 162                               struct perf_evsel *evsel);
 163
 164void perf_evlist__set_maps(struct perf_evlist *evlist, struct cpu_map *cpus,
 165                           struct thread_map *threads);
 166int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target);
 167int perf_evlist__apply_filters(struct perf_evlist *evlist, struct perf_evsel **err_evsel);
 168
 169void __perf_evlist__set_leader(struct list_head *list);
 170void perf_evlist__set_leader(struct perf_evlist *evlist);
 171
 172u64 perf_evlist__read_format(struct perf_evlist *evlist);
 173u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist);
 174u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist);
 175u64 perf_evlist__combined_branch_type(struct perf_evlist *evlist);
 176bool perf_evlist__sample_id_all(struct perf_evlist *evlist);
 177u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
 178
 179int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
 180                              struct perf_sample *sample);
 181
 182bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
 183bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
 184bool perf_evlist__valid_read_format(struct perf_evlist *evlist);
 185
 186void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
 187                                   struct list_head *list);
 188
 189static inline struct perf_evsel *perf_evlist__first(struct perf_evlist *evlist)
 190{
 191        return list_entry(evlist->entries.next, struct perf_evsel, node);
 192}
 193
 194static inline struct perf_evsel *perf_evlist__last(struct perf_evlist *evlist)
 195{
 196        return list_entry(evlist->entries.prev, struct perf_evsel, node);
 197}
 198
 199size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp);
 200
 201int perf_evlist__strerror_open(struct perf_evlist *evlist, int err, char *buf, size_t size);
 202int perf_evlist__strerror_mmap(struct perf_evlist *evlist, int err, char *buf, size_t size);
 203
 204static inline u64 perf_mmap__read_head(struct perf_mmap *mm)
 205{
 206        struct perf_event_mmap_page *pc = mm->base;
 207        u64 head = ACCESS_ONCE(pc->data_head);
 208        rmb();
 209        return head;
 210}
 211
 212static inline void perf_mmap__write_tail(struct perf_mmap *md, u64 tail)
 213{
 214        struct perf_event_mmap_page *pc = md->base;
 215
 216        /*
 217         * ensure all reads are done before we write the tail out.
 218         */
 219        mb();
 220        pc->data_tail = tail;
 221}
 222
 223bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char *str);
 224void perf_evlist__to_front(struct perf_evlist *evlist,
 225                           struct perf_evsel *move_evsel);
 226
 227/**
 228 * __evlist__for_each - iterate thru all the evsels
 229 * @list: list_head instance to iterate
 230 * @evsel: struct evsel iterator
 231 */
 232#define __evlist__for_each(list, evsel) \
 233        list_for_each_entry(evsel, list, node)
 234
 235/**
 236 * evlist__for_each - iterate thru all the evsels
 237 * @evlist: evlist instance to iterate
 238 * @evsel: struct evsel iterator
 239 */
 240#define evlist__for_each(evlist, evsel) \
 241        __evlist__for_each(&(evlist)->entries, evsel)
 242
 243/**
 244 * __evlist__for_each_continue - continue iteration thru all the evsels
 245 * @list: list_head instance to iterate
 246 * @evsel: struct evsel iterator
 247 */
 248#define __evlist__for_each_continue(list, evsel) \
 249        list_for_each_entry_continue(evsel, list, node)
 250
 251/**
 252 * evlist__for_each_continue - continue iteration thru all the evsels
 253 * @evlist: evlist instance to iterate
 254 * @evsel: struct evsel iterator
 255 */
 256#define evlist__for_each_continue(evlist, evsel) \
 257        __evlist__for_each_continue(&(evlist)->entries, evsel)
 258
 259/**
 260 * __evlist__for_each_reverse - iterate thru all the evsels in reverse order
 261 * @list: list_head instance to iterate
 262 * @evsel: struct evsel iterator
 263 */
 264#define __evlist__for_each_reverse(list, evsel) \
 265        list_for_each_entry_reverse(evsel, list, node)
 266
 267/**
 268 * evlist__for_each_reverse - iterate thru all the evsels in reverse order
 269 * @evlist: evlist instance to iterate
 270 * @evsel: struct evsel iterator
 271 */
 272#define evlist__for_each_reverse(evlist, evsel) \
 273        __evlist__for_each_reverse(&(evlist)->entries, evsel)
 274
 275/**
 276 * __evlist__for_each_safe - safely iterate thru all the evsels
 277 * @list: list_head instance to iterate
 278 * @tmp: struct evsel temp iterator
 279 * @evsel: struct evsel iterator
 280 */
 281#define __evlist__for_each_safe(list, tmp, evsel) \
 282        list_for_each_entry_safe(evsel, tmp, list, node)
 283
 284/**
 285 * evlist__for_each_safe - safely iterate thru all the evsels
 286 * @evlist: evlist instance to iterate
 287 * @evsel: struct evsel iterator
 288 * @tmp: struct evsel temp iterator
 289 */
 290#define evlist__for_each_safe(evlist, tmp, evsel) \
 291        __evlist__for_each_safe(&(evlist)->entries, tmp, evsel)
 292
 293void perf_evlist__set_tracking_event(struct perf_evlist *evlist,
 294                                     struct perf_evsel *tracking_evsel);
 295
 296void perf_event_attr__set_max_precise_ip(struct perf_event_attr *attr);
 297
 298struct perf_evsel *
 299perf_evlist__find_evsel_by_str(struct perf_evlist *evlist, const char *str);
 300#endif /* __PERF_EVLIST_H */
 301