1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2361c99a6SArnaldo Carvalho de Melo #ifndef __PERF_EVLIST_H 3361c99a6SArnaldo Carvalho de Melo #define __PERF_EVLIST_H 1 4361c99a6SArnaldo Carvalho de Melo 55c97cac6SArnaldo Carvalho de Melo #include <linux/compiler.h> 6877a7a11SArnaldo Carvalho de Melo #include <linux/kernel.h> 725a3720cSElena Reshetova #include <linux/refcount.h> 8361c99a6SArnaldo Carvalho de Melo #include <linux/list.h> 91b85337dSArnaldo Carvalho de Melo #include <api/fd/array.h> 1050d08e47SArnaldo Carvalho de Melo #include <stdio.h> 11ce9036a6SJiri Olsa #include <internal/evlist.h> 1247729258SArnaldo Carvalho de Melo #include "events_stats.h" 130c21f736SArnaldo Carvalho de Melo #include "evsel.h" 14e0fcfb08SArnaldo Carvalho de Melo #include <pthread.h> 159607ad3aSArnaldo Carvalho de Melo #include <signal.h> 1635b9d88eSArnaldo Carvalho de Melo #include <unistd.h> 17361c99a6SArnaldo Carvalho de Melo 185c581041SArnaldo Carvalho de Melo struct pollfd; 19f8a95309SArnaldo Carvalho de Melo struct thread_map; 20f854839bSJiri Olsa struct perf_cpu_map; 21b4006796SArnaldo Carvalho de Melo struct record_opts; 225c581041SArnaldo Carvalho de Melo 23e0fcfb08SArnaldo Carvalho de Melo /* 24e0fcfb08SArnaldo Carvalho de Melo * State machine of bkw_mmap_state: 25e0fcfb08SArnaldo Carvalho de Melo * 26e0fcfb08SArnaldo Carvalho de Melo * .________________(forbid)_____________. 27e0fcfb08SArnaldo Carvalho de Melo * | V 28e0fcfb08SArnaldo Carvalho de Melo * NOTREADY --(0)--> RUNNING --(1)--> DATA_PENDING --(2)--> EMPTY 29e0fcfb08SArnaldo Carvalho de Melo * ^ ^ | ^ | 30e0fcfb08SArnaldo Carvalho de Melo * | |__(forbid)____/ |___(forbid)___/| 31e0fcfb08SArnaldo Carvalho de Melo * | | 32e0fcfb08SArnaldo Carvalho de Melo * \_________________(3)_______________/ 33e0fcfb08SArnaldo Carvalho de Melo * 34e0fcfb08SArnaldo Carvalho de Melo * NOTREADY : Backward ring buffers are not ready 35e0fcfb08SArnaldo Carvalho de Melo * RUNNING : Backward ring buffers are recording 36e0fcfb08SArnaldo Carvalho de Melo * DATA_PENDING : We are required to collect data from backward ring buffers 37e0fcfb08SArnaldo Carvalho de Melo * EMPTY : We have collected data from backward ring buffers. 38e0fcfb08SArnaldo Carvalho de Melo * 39e0fcfb08SArnaldo Carvalho de Melo * (0): Setup backward ring buffer 40e0fcfb08SArnaldo Carvalho de Melo * (1): Pause ring buffers for reading 41e0fcfb08SArnaldo Carvalho de Melo * (2): Read from ring buffers 42e0fcfb08SArnaldo Carvalho de Melo * (3): Resume ring buffers for recording 43e0fcfb08SArnaldo Carvalho de Melo */ 44e0fcfb08SArnaldo Carvalho de Melo enum bkw_mmap_state { 45e0fcfb08SArnaldo Carvalho de Melo BKW_MMAP_NOTREADY, 46e0fcfb08SArnaldo Carvalho de Melo BKW_MMAP_RUNNING, 47e0fcfb08SArnaldo Carvalho de Melo BKW_MMAP_DATA_PENDING, 48e0fcfb08SArnaldo Carvalho de Melo BKW_MMAP_EMPTY, 49e0fcfb08SArnaldo Carvalho de Melo }; 50e0fcfb08SArnaldo Carvalho de Melo 5170db7533SArnaldo Carvalho de Melo #define PERF_EVLIST__HLIST_BITS 8 5270db7533SArnaldo Carvalho de Melo #define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS) 5370db7533SArnaldo Carvalho de Melo 5463503dbaSJiri Olsa struct evlist { 55ce9036a6SJiri Olsa struct perf_evlist core; 5670db7533SArnaldo Carvalho de Melo struct hlist_head heads[PERF_EVLIST__HLIST_SIZE]; 5797f63e4aSNamhyung Kim int nr_groups; 58aece948fSArnaldo Carvalho de Melo int nr_mmaps; 592b56bcfbSArnaldo Carvalho de Melo bool enabled; 60994a1f78SJiri Olsa size_t mmap_len; 6175562573SAdrian Hunter int id_pos; 6275562573SAdrian Hunter int is_pos; 6375562573SAdrian Hunter u64 combined_sample_type; 6454cc54deSWang Nan enum bkw_mmap_state bkw_mmap_state; 6535b9d88eSArnaldo Carvalho de Melo struct { 6635b9d88eSArnaldo Carvalho de Melo int cork_fd; 6735b9d88eSArnaldo Carvalho de Melo pid_t pid; 6835b9d88eSArnaldo Carvalho de Melo } workload; 691b85337dSArnaldo Carvalho de Melo struct fdarray pollfd; 70a5830532SJiri Olsa struct mmap *mmap; 71a5830532SJiri Olsa struct mmap *overwrite_mmap; 7232dcd021SJiri Olsa struct evsel *selected; 7375be989aSArnaldo Carvalho de Melo struct events_stats stats; 742c07144dSKan Liang struct perf_env *env; 7563503dbaSJiri Olsa void (*trace_event_sample_raw)(struct evlist *evlist, 7693115d32SThomas Richter union perf_event *event, 7793115d32SThomas Richter struct perf_sample *sample); 786011518dSJin Yao u64 first_sample_time; 796011518dSJin Yao u64 last_sample_time; 80657ee553SSong Liu struct { 81657ee553SSong Liu pthread_t th; 82657ee553SSong Liu volatile int done; 83657ee553SSong Liu } thread; 84361c99a6SArnaldo Carvalho de Melo }; 85361c99a6SArnaldo Carvalho de Melo 8632dcd021SJiri Olsa struct evsel_str_handler { 87ee29be62SArnaldo Carvalho de Melo const char *name; 88ee29be62SArnaldo Carvalho de Melo void *handler; 89ee29be62SArnaldo Carvalho de Melo }; 90ee29be62SArnaldo Carvalho de Melo 910f98b11cSJiri Olsa struct evlist *evlist__new(void); 9263503dbaSJiri Olsa struct evlist *perf_evlist__new_default(void); 9363503dbaSJiri Olsa struct evlist *perf_evlist__new_dummy(void); 9452c86bcaSJiri Olsa void evlist__init(struct evlist *evlist, struct perf_cpu_map *cpus, 959749b90eSJiri Olsa struct perf_thread_map *threads); 96470579b0SJiri Olsa void evlist__exit(struct evlist *evlist); 97c12995a5SJiri Olsa void evlist__delete(struct evlist *evlist); 98361c99a6SArnaldo Carvalho de Melo 99a1cf3a75SJiri Olsa void evlist__add(struct evlist *evlist, struct evsel *entry); 10016251027SJiri Olsa void evlist__remove(struct evlist *evlist, struct evsel *evsel); 101db918acbSArnaldo Carvalho de Melo 10263503dbaSJiri Olsa int __perf_evlist__add_default(struct evlist *evlist, bool precise); 103db918acbSArnaldo Carvalho de Melo 10463503dbaSJiri Olsa static inline int perf_evlist__add_default(struct evlist *evlist) 105db918acbSArnaldo Carvalho de Melo { 106db918acbSArnaldo Carvalho de Melo return __perf_evlist__add_default(evlist, true); 107db918acbSArnaldo Carvalho de Melo } 108db918acbSArnaldo Carvalho de Melo 10963503dbaSJiri Olsa int __perf_evlist__add_default_attrs(struct evlist *evlist, 11079695e1bSArnaldo Carvalho de Melo struct perf_event_attr *attrs, size_t nr_attrs); 11150d08e47SArnaldo Carvalho de Melo 11279695e1bSArnaldo Carvalho de Melo #define perf_evlist__add_default_attrs(evlist, array) \ 11379695e1bSArnaldo Carvalho de Melo __perf_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array)) 114361c99a6SArnaldo Carvalho de Melo 11563503dbaSJiri Olsa int perf_evlist__add_dummy(struct evlist *evlist); 1165bae0250SArnaldo Carvalho de Melo 11763503dbaSJiri Olsa int perf_evlist__add_sb_event(struct evlist **evlist, 118657ee553SSong Liu struct perf_event_attr *attr, 119657ee553SSong Liu perf_evsel__sb_cb_t cb, 120657ee553SSong Liu void *data); 12163503dbaSJiri Olsa int perf_evlist__start_sb_thread(struct evlist *evlist, 122657ee553SSong Liu struct target *target); 12363503dbaSJiri Olsa void perf_evlist__stop_sb_thread(struct evlist *evlist); 124657ee553SSong Liu 12563503dbaSJiri Olsa int perf_evlist__add_newtp(struct evlist *evlist, 12639876e7dSArnaldo Carvalho de Melo const char *sys, const char *name, void *handler); 12739876e7dSArnaldo Carvalho de Melo 12863503dbaSJiri Olsa void __perf_evlist__set_sample_bit(struct evlist *evlist, 12922c8a376SArnaldo Carvalho de Melo enum perf_event_sample_format bit); 13063503dbaSJiri Olsa void __perf_evlist__reset_sample_bit(struct evlist *evlist, 13122c8a376SArnaldo Carvalho de Melo enum perf_event_sample_format bit); 13222c8a376SArnaldo Carvalho de Melo 13322c8a376SArnaldo Carvalho de Melo #define perf_evlist__set_sample_bit(evlist, bit) \ 13422c8a376SArnaldo Carvalho de Melo __perf_evlist__set_sample_bit(evlist, PERF_SAMPLE_##bit) 13522c8a376SArnaldo Carvalho de Melo 13622c8a376SArnaldo Carvalho de Melo #define perf_evlist__reset_sample_bit(evlist, bit) \ 13722c8a376SArnaldo Carvalho de Melo __perf_evlist__reset_sample_bit(evlist, PERF_SAMPLE_##bit) 13822c8a376SArnaldo Carvalho de Melo 13963503dbaSJiri Olsa int perf_evlist__set_tp_filter(struct evlist *evlist, const char *filter); 14063503dbaSJiri Olsa int perf_evlist__set_tp_filter_pid(struct evlist *evlist, pid_t pid); 14163503dbaSJiri Olsa int perf_evlist__set_tp_filter_pids(struct evlist *evlist, size_t npids, pid_t *pids); 142745cefc5SArnaldo Carvalho de Melo 14332dcd021SJiri Olsa struct evsel * 14463503dbaSJiri Olsa perf_evlist__find_tracepoint_by_id(struct evlist *evlist, int id); 145da378962SArnaldo Carvalho de Melo 14632dcd021SJiri Olsa struct evsel * 14763503dbaSJiri Olsa perf_evlist__find_tracepoint_by_name(struct evlist *evlist, 148a2f2804aSDavid Ahern const char *name); 149a2f2804aSDavid Ahern 15063503dbaSJiri Olsa void perf_evlist__id_add(struct evlist *evlist, struct evsel *evsel, 1513d3b5e95SArnaldo Carvalho de Melo int cpu, int thread, u64 id); 15263503dbaSJiri Olsa int perf_evlist__id_add_fd(struct evlist *evlist, 15332dcd021SJiri Olsa struct evsel *evsel, 1541c59612dSJiri Olsa int cpu, int thread, int fd); 1553d3b5e95SArnaldo Carvalho de Melo 15663503dbaSJiri Olsa int perf_evlist__add_pollfd(struct evlist *evlist, int fd); 15763503dbaSJiri Olsa int perf_evlist__alloc_pollfd(struct evlist *evlist); 15863503dbaSJiri Olsa int perf_evlist__filter_pollfd(struct evlist *evlist, short revents_and_mask); 1591ddec7f0SArnaldo Carvalho de Melo 16063503dbaSJiri Olsa int perf_evlist__poll(struct evlist *evlist, int timeout); 161f66a889dSArnaldo Carvalho de Melo 16263503dbaSJiri Olsa struct evsel *perf_evlist__id2evsel(struct evlist *evlist, u64 id); 16363503dbaSJiri Olsa struct evsel *perf_evlist__id2evsel_strict(struct evlist *evlist, 164dddcf6abSAdrian Hunter u64 id); 16570db7533SArnaldo Carvalho de Melo 16663503dbaSJiri Olsa struct perf_sample_id *perf_evlist__id2sid(struct evlist *evlist, u64 id); 167932a3594SJiri Olsa 16863503dbaSJiri Olsa void perf_evlist__toggle_bkw_mmap(struct evlist *evlist, enum bkw_mmap_state state); 16954cc54deSWang Nan 1709521b5f2SJiri Olsa void evlist__mmap_consume(struct evlist *evlist, int idx); 1718e50d384SZhouyi Zhou 172474ddc4cSJiri Olsa int evlist__open(struct evlist *evlist); 173750b4edeSJiri Olsa void evlist__close(struct evlist *evlist); 174727ab04eSArnaldo Carvalho de Melo 175e68ae9cfSArnaldo Carvalho de Melo struct callchain_param; 176e68ae9cfSArnaldo Carvalho de Melo 17763503dbaSJiri Olsa void perf_evlist__set_id_pos(struct evlist *evlist); 17875562573SAdrian Hunter bool perf_can_sample_identifier(void); 179b757bb09SAdrian Hunter bool perf_can_record_switch_events(void); 18083509565SAdrian Hunter bool perf_can_record_cpu_wide(void); 18163503dbaSJiri Olsa void perf_evlist__config(struct evlist *evlist, struct record_opts *opts, 182e68ae9cfSArnaldo Carvalho de Melo struct callchain_param *callchain); 183b4006796SArnaldo Carvalho de Melo int record_opts__config(struct record_opts *opts); 1840f82ebc4SArnaldo Carvalho de Melo 18563503dbaSJiri Olsa int perf_evlist__prepare_workload(struct evlist *evlist, 186602ad878SArnaldo Carvalho de Melo struct target *target, 18755e162eaSNamhyung Kim const char *argv[], bool pipe_output, 188735f7e0bSArnaldo Carvalho de Melo void (*exec_error)(int signo, siginfo_t *info, 189735f7e0bSArnaldo Carvalho de Melo void *ucontext)); 19063503dbaSJiri Olsa int perf_evlist__start_workload(struct evlist *evlist); 19135b9d88eSArnaldo Carvalho de Melo 192724ce97eSArnaldo Carvalho de Melo struct option; 193724ce97eSArnaldo Carvalho de Melo 194e9db1310SAdrian Hunter int __perf_evlist__parse_mmap_pages(unsigned int *mmap_pages, const char *str); 195994a1f78SJiri Olsa int perf_evlist__parse_mmap_pages(const struct option *opt, 196994a1f78SJiri Olsa const char *str, 197994a1f78SJiri Olsa int unset); 198994a1f78SJiri Olsa 199f5e7150cSArnaldo Carvalho de Melo unsigned long perf_event_mlock_kb_in_pages(void); 200f5e7150cSArnaldo Carvalho de Melo 2019521b5f2SJiri Olsa int evlist__mmap_ex(struct evlist *evlist, unsigned int pages, 2027a276ff6SWang Nan unsigned int auxtrace_pages, 203470530bbSAlexey Budankov bool auxtrace_overwrite, int nr_cblocks, 20451255a8aSAlexey Budankov int affinity, int flush, int comp_level); 2059521b5f2SJiri Olsa int evlist__mmap(struct evlist *evlist, unsigned int pages); 206db6b7b13SJiri Olsa void evlist__munmap(struct evlist *evlist); 2077e2ed097SArnaldo Carvalho de Melo 2089521b5f2SJiri Olsa size_t evlist__mmap_size(unsigned long pages); 2090c582449SJiri Olsa 210e74676deSJiri Olsa void evlist__disable(struct evlist *evlist); 2111c87f165SJiri Olsa void evlist__enable(struct evlist *evlist); 21263503dbaSJiri Olsa void perf_evlist__toggle_enable(struct evlist *evlist); 2134152ab37SArnaldo Carvalho de Melo 21463503dbaSJiri Olsa int perf_evlist__enable_event_idx(struct evlist *evlist, 21532dcd021SJiri Olsa struct evsel *evsel, int idx); 216395c3070SAdrian Hunter 21763503dbaSJiri Olsa void perf_evlist__set_selected(struct evlist *evlist, 21832dcd021SJiri Olsa struct evsel *evsel); 21981cce8deSArnaldo Carvalho de Melo 22063503dbaSJiri Olsa int perf_evlist__create_maps(struct evlist *evlist, struct target *target); 22163503dbaSJiri Olsa int perf_evlist__apply_filters(struct evlist *evlist, struct evsel **err_evsel); 222f8a95309SArnaldo Carvalho de Melo 22363dab225SArnaldo Carvalho de Melo void __perf_evlist__set_leader(struct list_head *list); 22463503dbaSJiri Olsa void perf_evlist__set_leader(struct evlist *evlist); 22563dab225SArnaldo Carvalho de Melo 22663503dbaSJiri Olsa u64 perf_evlist__read_format(struct evlist *evlist); 22763503dbaSJiri Olsa u64 __perf_evlist__combined_sample_type(struct evlist *evlist); 22863503dbaSJiri Olsa u64 perf_evlist__combined_sample_type(struct evlist *evlist); 22963503dbaSJiri Olsa u64 perf_evlist__combined_branch_type(struct evlist *evlist); 23063503dbaSJiri Olsa bool perf_evlist__sample_id_all(struct evlist *evlist); 23163503dbaSJiri Olsa u16 perf_evlist__id_hdr_size(struct evlist *evlist); 23274429964SFrederic Weisbecker 23363503dbaSJiri Olsa int perf_evlist__parse_sample(struct evlist *evlist, union perf_event *event, 2340807d2d8SArnaldo Carvalho de Melo struct perf_sample *sample); 235cb0b29e0SArnaldo Carvalho de Melo 23663503dbaSJiri Olsa int perf_evlist__parse_sample_timestamp(struct evlist *evlist, 23701468120SJiri Olsa union perf_event *event, 23801468120SJiri Olsa u64 *timestamp); 23901468120SJiri Olsa 24063503dbaSJiri Olsa bool perf_evlist__valid_sample_type(struct evlist *evlist); 24163503dbaSJiri Olsa bool perf_evlist__valid_sample_id_all(struct evlist *evlist); 24263503dbaSJiri Olsa bool perf_evlist__valid_read_format(struct evlist *evlist); 2430529bc1fSJiri Olsa 24463503dbaSJiri Olsa void perf_evlist__splice_list_tail(struct evlist *evlist, 245f114d6efSAdrian Hunter struct list_head *list); 2460c21f736SArnaldo Carvalho de Melo 24763503dbaSJiri Olsa static inline bool perf_evlist__empty(struct evlist *evlist) 24864831a21SDavid Carrillo-Cisneros { 249ce9036a6SJiri Olsa return list_empty(&evlist->core.entries); 25064831a21SDavid Carrillo-Cisneros } 25164831a21SDavid Carrillo-Cisneros 25263503dbaSJiri Olsa static inline struct evsel *perf_evlist__first(struct evlist *evlist) 2530c21f736SArnaldo Carvalho de Melo { 254ce9036a6SJiri Olsa return list_entry(evlist->core.entries.next, struct evsel, core.node); 2550c21f736SArnaldo Carvalho de Melo } 2560c21f736SArnaldo Carvalho de Melo 25763503dbaSJiri Olsa static inline struct evsel *perf_evlist__last(struct evlist *evlist) 2580c21f736SArnaldo Carvalho de Melo { 259ce9036a6SJiri Olsa return list_entry(evlist->core.entries.prev, struct evsel, core.node); 2600c21f736SArnaldo Carvalho de Melo } 26178f067b3SArnaldo Carvalho de Melo 26263503dbaSJiri Olsa size_t perf_evlist__fprintf(struct evlist *evlist, FILE *fp); 2630479b8b9SDavid Ahern 26463503dbaSJiri Olsa int perf_evlist__strerror_open(struct evlist *evlist, int err, char *buf, size_t size); 26563503dbaSJiri Olsa int perf_evlist__strerror_mmap(struct evlist *evlist, int err, char *buf, size_t size); 2666ef068cbSArnaldo Carvalho de Melo 26763503dbaSJiri Olsa bool perf_evlist__can_select_event(struct evlist *evlist, const char *str); 26863503dbaSJiri Olsa void perf_evlist__to_front(struct evlist *evlist, 26932dcd021SJiri Olsa struct evsel *move_evsel); 270a025e4f0SAdrian Hunter 2710050f7aaSArnaldo Carvalho de Melo /** 272e5cadb93SArnaldo Carvalho de Melo * __evlist__for_each_entry - iterate thru all the evsels 2730050f7aaSArnaldo Carvalho de Melo * @list: list_head instance to iterate 2740050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 2750050f7aaSArnaldo Carvalho de Melo */ 276e5cadb93SArnaldo Carvalho de Melo #define __evlist__for_each_entry(list, evsel) \ 277b27c4eceSJiri Olsa list_for_each_entry(evsel, list, core.node) 2780050f7aaSArnaldo Carvalho de Melo 2790050f7aaSArnaldo Carvalho de Melo /** 280e5cadb93SArnaldo Carvalho de Melo * evlist__for_each_entry - iterate thru all the evsels 2810050f7aaSArnaldo Carvalho de Melo * @evlist: evlist instance to iterate 2820050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 2830050f7aaSArnaldo Carvalho de Melo */ 284e5cadb93SArnaldo Carvalho de Melo #define evlist__for_each_entry(evlist, evsel) \ 285ce9036a6SJiri Olsa __evlist__for_each_entry(&(evlist)->core.entries, evsel) 2860050f7aaSArnaldo Carvalho de Melo 2870050f7aaSArnaldo Carvalho de Melo /** 288e5cadb93SArnaldo Carvalho de Melo * __evlist__for_each_entry_continue - continue iteration thru all the evsels 2890050f7aaSArnaldo Carvalho de Melo * @list: list_head instance to iterate 2900050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 2910050f7aaSArnaldo Carvalho de Melo */ 292e5cadb93SArnaldo Carvalho de Melo #define __evlist__for_each_entry_continue(list, evsel) \ 293b27c4eceSJiri Olsa list_for_each_entry_continue(evsel, list, core.node) 2940050f7aaSArnaldo Carvalho de Melo 2950050f7aaSArnaldo Carvalho de Melo /** 296e5cadb93SArnaldo Carvalho de Melo * evlist__for_each_entry_continue - continue iteration thru all the evsels 2970050f7aaSArnaldo Carvalho de Melo * @evlist: evlist instance to iterate 2980050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 2990050f7aaSArnaldo Carvalho de Melo */ 300e5cadb93SArnaldo Carvalho de Melo #define evlist__for_each_entry_continue(evlist, evsel) \ 301ce9036a6SJiri Olsa __evlist__for_each_entry_continue(&(evlist)->core.entries, evsel) 3020050f7aaSArnaldo Carvalho de Melo 3030050f7aaSArnaldo Carvalho de Melo /** 304e5cadb93SArnaldo Carvalho de Melo * __evlist__for_each_entry_reverse - iterate thru all the evsels in reverse order 3050050f7aaSArnaldo Carvalho de Melo * @list: list_head instance to iterate 3060050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 3070050f7aaSArnaldo Carvalho de Melo */ 308e5cadb93SArnaldo Carvalho de Melo #define __evlist__for_each_entry_reverse(list, evsel) \ 309b27c4eceSJiri Olsa list_for_each_entry_reverse(evsel, list, core.node) 3100050f7aaSArnaldo Carvalho de Melo 3110050f7aaSArnaldo Carvalho de Melo /** 312e5cadb93SArnaldo Carvalho de Melo * evlist__for_each_entry_reverse - iterate thru all the evsels in reverse order 3130050f7aaSArnaldo Carvalho de Melo * @evlist: evlist instance to iterate 3140050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 3150050f7aaSArnaldo Carvalho de Melo */ 316e5cadb93SArnaldo Carvalho de Melo #define evlist__for_each_entry_reverse(evlist, evsel) \ 317ce9036a6SJiri Olsa __evlist__for_each_entry_reverse(&(evlist)->core.entries, evsel) 3180050f7aaSArnaldo Carvalho de Melo 3190050f7aaSArnaldo Carvalho de Melo /** 320e5cadb93SArnaldo Carvalho de Melo * __evlist__for_each_entry_safe - safely iterate thru all the evsels 3210050f7aaSArnaldo Carvalho de Melo * @list: list_head instance to iterate 3220050f7aaSArnaldo Carvalho de Melo * @tmp: struct evsel temp iterator 3230050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 3240050f7aaSArnaldo Carvalho de Melo */ 325e5cadb93SArnaldo Carvalho de Melo #define __evlist__for_each_entry_safe(list, tmp, evsel) \ 326b27c4eceSJiri Olsa list_for_each_entry_safe(evsel, tmp, list, core.node) 3270050f7aaSArnaldo Carvalho de Melo 3280050f7aaSArnaldo Carvalho de Melo /** 329e5cadb93SArnaldo Carvalho de Melo * evlist__for_each_entry_safe - safely iterate thru all the evsels 3300050f7aaSArnaldo Carvalho de Melo * @evlist: evlist instance to iterate 3310050f7aaSArnaldo Carvalho de Melo * @evsel: struct evsel iterator 3320050f7aaSArnaldo Carvalho de Melo * @tmp: struct evsel temp iterator 3330050f7aaSArnaldo Carvalho de Melo */ 334e5cadb93SArnaldo Carvalho de Melo #define evlist__for_each_entry_safe(evlist, tmp, evsel) \ 335ce9036a6SJiri Olsa __evlist__for_each_entry_safe(&(evlist)->core.entries, tmp, evsel) 336c09ec622SAdrian Hunter 33763503dbaSJiri Olsa void perf_evlist__set_tracking_event(struct evlist *evlist, 33832dcd021SJiri Olsa struct evsel *tracking_evsel); 33945cf6c33SJiri Olsa 34032dcd021SJiri Olsa struct evsel * 34163503dbaSJiri Olsa perf_evlist__find_evsel_by_str(struct evlist *evlist, const char *str); 3427cb5c5acSJiri Olsa 34363503dbaSJiri Olsa struct evsel *perf_evlist__event2evsel(struct evlist *evlist, 3447cb5c5acSJiri Olsa union perf_event *event); 34507d6f446SArnaldo Carvalho de Melo 34663503dbaSJiri Olsa bool perf_evlist__exclude_kernel(struct evlist *evlist); 347e2bdbe80SJin Yao 34863503dbaSJiri Olsa void perf_evlist__force_leader(struct evlist *evlist); 349e2bdbe80SJin Yao 35063503dbaSJiri Olsa struct evsel *perf_evlist__reset_weak_group(struct evlist *evlist, 35132dcd021SJiri Olsa struct evsel *evsel); 352361c99a6SArnaldo Carvalho de Melo #endif /* __PERF_EVLIST_H */ 353