Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
evsel.h
Go to the documentation of this file.
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 
14  union {
15  struct {
19  };
20  u64 values[3];
21  };
22 };
23 
24 struct perf_counts {
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  */
37  struct hlist_node node;
39  struct perf_evsel *evsel;
40 };
41 
48 struct perf_evsel {
49  struct list_head node;
51  char *filter;
52  struct xyarray *fd;
53  struct xyarray *sample_id;
54  u64 *id;
56  int idx;
58  struct hists hists;
59  char *name;
61  union {
62  void *priv;
64  };
65  struct cgroup_sel *cgrp;
66  struct {
67  void *func;
68  void *data;
69  } handler;
70  struct cpu_map *cpus;
71  unsigned int sample_size;
72  bool supported;
73  bool needs_swap;
74  /* parse modifier helper */
76  struct perf_evsel *leader;
77  char *group_name;
78 };
79 
80 struct cpu_map;
81 struct thread_map;
82 struct perf_evlist;
83 struct perf_record_opts;
84 
85 struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx);
86 struct perf_evsel *perf_evsel__newtp(const char *sys, const char *name, int idx);
87 
88 struct event_format *event_format__new(const char *sys, const char *name);
89 
90 void perf_evsel__init(struct perf_evsel *evsel,
91  struct perf_event_attr *attr, int idx);
92 void perf_evsel__exit(struct perf_evsel *evsel);
93 void perf_evsel__delete(struct perf_evsel *evsel);
94 
95 void perf_evsel__config(struct perf_evsel *evsel,
96  struct perf_record_opts *opts,
97  struct perf_evsel *first);
98 
100 
101 #define PERF_EVSEL__MAX_ALIASES 8
102 
109 extern const char *perf_evsel__hw_names[PERF_COUNT_HW_MAX];
110 extern const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX];
112  char *bf, size_t size);
113 const char *perf_evsel__name(struct perf_evsel *evsel);
114 
115 int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
116 int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads);
117 int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus);
118 void perf_evsel__free_fd(struct perf_evsel *evsel);
119 void perf_evsel__free_id(struct perf_evsel *evsel);
120 void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
121 
122 int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads,
123  const char *filter);
124 
125 int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
126  struct cpu_map *cpus);
127 int perf_evsel__open_per_thread(struct perf_evsel *evsel,
128  struct thread_map *threads);
129 int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
130  struct thread_map *threads);
131 void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads);
132 
133 struct perf_sample;
134 
135 void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample,
136  const char *name);
137 u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample,
138  const char *name);
139 
140 static inline char *perf_evsel__strval(struct perf_evsel *evsel,
141  struct perf_sample *sample,
142  const char *name)
143 {
144  return perf_evsel__rawptr(evsel, sample, name);
145 }
146 
147 struct format_field;
148 
149 struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name);
150 
151 #define perf_evsel__match(evsel, t, c) \
152  (evsel->attr.type == PERF_TYPE_##t && \
153  evsel->attr.config == PERF_COUNT_##c)
154 
155 static inline bool perf_evsel__match2(struct perf_evsel *e1,
156  struct perf_evsel *e2)
157 {
158  return (e1->attr.type == e2->attr.type) &&
159  (e1->attr.config == e2->attr.config);
160 }
161 
162 int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,
163  int cpu, int thread, bool scale);
164 
172 static inline int perf_evsel__read_on_cpu(struct perf_evsel *evsel,
173  int cpu, int thread)
174 {
175  return __perf_evsel__read_on_cpu(evsel, cpu, thread, false);
176 }
177 
185 static inline int perf_evsel__read_on_cpu_scaled(struct perf_evsel *evsel,
186  int cpu, int thread)
187 {
188  return __perf_evsel__read_on_cpu(evsel, cpu, thread, true);
189 }
190 
191 int __perf_evsel__read(struct perf_evsel *evsel, int ncpus, int nthreads,
192  bool scale);
193 
201 static inline int perf_evsel__read(struct perf_evsel *evsel,
202  int ncpus, int nthreads)
203 {
204  return __perf_evsel__read(evsel, ncpus, nthreads, false);
205 }
206 
214 static inline int perf_evsel__read_scaled(struct perf_evsel *evsel,
215  int ncpus, int nthreads)
216 {
217  return __perf_evsel__read(evsel, ncpus, nthreads, true);
218 }
219 
220 void hists__init(struct hists *hists);
221 
222 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
223  struct perf_sample *sample);
224 
225 static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel)
226 {
227  return list_entry(evsel->node.next, struct perf_evsel, node);
228 }
229 #endif /* __PERF_EVSEL_H */