Home | History | Annotate | Download | only in util
      1 #ifndef __PERF_EVLIST_H
      2 #define __PERF_EVLIST_H 1
      3 
      4 #include <linux/list.h>
      5 #include <stdio.h>
      6 #include "../perf.h"
      7 #include "event.h"
      8 #include "evsel.h"
      9 #include "util.h"
     10 #include <unistd.h>
     11 
     12 struct pollfd;
     13 struct thread_map;
     14 struct cpu_map;
     15 struct perf_record_opts;
     16 
     17 #define PERF_EVLIST__HLIST_BITS 8
     18 #define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS)
     19 
     20 struct perf_mmap {
     21 	void		 *base;
     22 	int		 mask;
     23 	unsigned int	 prev;
     24 	union perf_event event_copy;
     25 };
     26 
     27 struct 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_fds;
     33 	int		 nr_mmaps;
     34 	int		 mmap_len;
     35 	int		 id_pos;
     36 	int		 is_pos;
     37 	u64		 combined_sample_type;
     38 	struct {
     39 		int	cork_fd;
     40 		pid_t	pid;
     41 	} workload;
     42 	bool		 overwrite;
     43 	struct perf_mmap *mmap;
     44 	struct pollfd	 *pollfd;
     45 	struct thread_map *threads;
     46 	struct cpu_map	  *cpus;
     47 	struct perf_evsel *selected;
     48 };
     49 
     50 struct perf_evsel_str_handler {
     51 	const char *name;
     52 	void	   *handler;
     53 };
     54 
     55 struct perf_evlist *perf_evlist__new(void);
     56 void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus,
     57 		       struct thread_map *threads);
     58 void perf_evlist__exit(struct perf_evlist *evlist);
     59 void perf_evlist__delete(struct perf_evlist *evlist);
     60 
     61 void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry);
     62 int perf_evlist__add_default(struct perf_evlist *evlist);
     63 int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
     64 				     struct perf_event_attr *attrs, size_t nr_attrs);
     65 
     66 #define perf_evlist__add_default_attrs(evlist, array) \
     67 	__perf_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))
     68 
     69 int perf_evlist__add_newtp(struct perf_evlist *evlist,
     70 			   const char *sys, const char *name, void *handler);
     71 
     72 int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter);
     73 
     74 struct perf_evsel *
     75 perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id);
     76 
     77 struct perf_evsel *
     78 perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
     79 				     const char *name);
     80 
     81 void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
     82 			 int cpu, int thread, u64 id);
     83 
     84 void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);
     85 
     86 struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);
     87 
     88 struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id);
     89 
     90 union perf_event *perf_evlist__mmap_read(struct perf_evlist *self, int idx);
     91 
     92 void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx);
     93 
     94 int perf_evlist__open(struct perf_evlist *evlist);
     95 void perf_evlist__close(struct perf_evlist *evlist);
     96 
     97 void perf_evlist__set_id_pos(struct perf_evlist *evlist);
     98 bool perf_can_sample_identifier(void);
     99 void perf_evlist__config(struct perf_evlist *evlist,
    100 			 struct perf_record_opts *opts);
    101 
    102 int perf_evlist__prepare_workload(struct perf_evlist *evlist,
    103 				  struct perf_target *target,
    104 				  const char *argv[], bool pipe_output,
    105 				  bool want_signal);
    106 int perf_evlist__start_workload(struct perf_evlist *evlist);
    107 
    108 int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
    109 		      bool overwrite);
    110 void perf_evlist__munmap(struct perf_evlist *evlist);
    111 
    112 void perf_evlist__disable(struct perf_evlist *evlist);
    113 void perf_evlist__enable(struct perf_evlist *evlist);
    114 
    115 int perf_evlist__disable_event(struct perf_evlist *evlist,
    116 			       struct perf_evsel *evsel);
    117 int perf_evlist__enable_event(struct perf_evlist *evlist,
    118 			      struct perf_evsel *evsel);
    119 
    120 void perf_evlist__set_selected(struct perf_evlist *evlist,
    121 			       struct perf_evsel *evsel);
    122 
    123 static inline void perf_evlist__set_maps(struct perf_evlist *evlist,
    124 					 struct cpu_map *cpus,
    125 					 struct thread_map *threads)
    126 {
    127 	evlist->cpus	= cpus;
    128 	evlist->threads	= threads;
    129 }
    130 
    131 int perf_evlist__create_maps(struct perf_evlist *evlist,
    132 			     struct perf_target *target);
    133 void perf_evlist__delete_maps(struct perf_evlist *evlist);
    134 int perf_evlist__apply_filters(struct perf_evlist *evlist);
    135 
    136 void __perf_evlist__set_leader(struct list_head *list);
    137 void perf_evlist__set_leader(struct perf_evlist *evlist);
    138 
    139 u64 perf_evlist__read_format(struct perf_evlist *evlist);
    140 u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist);
    141 u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist);
    142 bool perf_evlist__sample_id_all(struct perf_evlist *evlist);
    143 u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
    144 
    145 int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
    146 			      struct perf_sample *sample);
    147 
    148 bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
    149 bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
    150 bool perf_evlist__valid_read_format(struct perf_evlist *evlist);
    151 
    152 void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
    153 				   struct list_head *list,
    154 				   int nr_entries);
    155 
    156 static inline struct perf_evsel *perf_evlist__first(struct perf_evlist *evlist)
    157 {
    158 	return list_entry(evlist->entries.next, struct perf_evsel, node);
    159 }
    160 
    161 static inline struct perf_evsel *perf_evlist__last(struct perf_evlist *evlist)
    162 {
    163 	return list_entry(evlist->entries.prev, struct perf_evsel, node);
    164 }
    165 
    166 size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp);
    167 
    168 static inline unsigned int perf_mmap__read_head(struct perf_mmap *mm)
    169 {
    170 	struct perf_event_mmap_page *pc = mm->base;
    171 	int head = pc->data_head;
    172 	rmb();
    173 	return head;
    174 }
    175 
    176 static inline void perf_mmap__write_tail(struct perf_mmap *md,
    177 					 unsigned long tail)
    178 {
    179 	struct perf_event_mmap_page *pc = md->base;
    180 
    181 	/*
    182 	 * ensure all reads are done before we write the tail out.
    183 	 */
    184 	/* mb(); */
    185 	pc->data_tail = tail;
    186 }
    187 
    188 #endif /* __PERF_EVLIST_H */
    189