1#ifndef _LINUX_TRACEPOINT_H
2#define _LINUX_TRACEPOINT_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/errno.h>
18#include <linux/types.h>
19#include <linux/rcupdate.h>
20#include <linux/jump_label.h>
21
22struct module;
23struct tracepoint;
24
25struct tracepoint_func {
26 void *func;
27 void *data;
28};
29
30struct tracepoint {
31 const char *name;
32 int state;
33 void (*regfunc)(void);
34 void (*unregfunc)(void);
35 struct tracepoint_func __rcu *funcs;
36};
37
38
39
40
41
42extern int tracepoint_probe_register(const char *name, void *probe, void *data);
43
44
45
46
47
48extern int
49tracepoint_probe_unregister(const char *name, void *probe, void *data);
50
51extern int tracepoint_probe_register_noupdate(const char *name, void *probe,
52 void *data);
53extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe,
54 void *data);
55extern void tracepoint_probe_update_all(void);
56
57struct tracepoint_iter {
58 struct module *module;
59 struct tracepoint * const *tracepoint;
60};
61
62extern void tracepoint_iter_start(struct tracepoint_iter *iter);
63extern void tracepoint_iter_next(struct tracepoint_iter *iter);
64extern void tracepoint_iter_stop(struct tracepoint_iter *iter);
65extern void tracepoint_iter_reset(struct tracepoint_iter *iter);
66extern int tracepoint_get_iter_range(struct tracepoint * const **tracepoint,
67 struct tracepoint * const *begin, struct tracepoint * const *end);
68
69
70
71
72
73
74static inline void tracepoint_synchronize_unregister(void)
75{
76 synchronize_sched();
77}
78
79#define PARAMS(args...) args
80
81#ifdef CONFIG_TRACEPOINTS
82extern
83void tracepoint_update_probe_range(struct tracepoint * const *begin,
84 struct tracepoint * const *end);
85#else
86static inline
87void tracepoint_update_probe_range(struct tracepoint * const *begin,
88 struct tracepoint * const *end)
89{ }
90#endif
91
92#endif
93
94
95
96
97
98
99
100
101
102#ifndef DECLARE_TRACE
103
104#define TP_PROTO(args...) args
105#define TP_ARGS(args...) args
106#define TP_CONDITION(args...) args
107
108#ifdef CONFIG_TRACEPOINTS
109
110
111
112
113
114
115
116
117
118
119
120#define __DO_TRACE(tp, proto, args, cond) \
121 do { \
122 struct tracepoint_func *it_func_ptr; \
123 void *it_func; \
124 void *__data; \
125 \
126 if (!(cond)) \
127 return; \
128 rcu_read_lock_sched_notrace(); \
129 it_func_ptr = rcu_dereference_sched((tp)->funcs); \
130 if (it_func_ptr) { \
131 do { \
132 it_func = (it_func_ptr)->func; \
133 __data = (it_func_ptr)->data; \
134 ((void(*)(proto))(it_func))(args); \
135 } while ((++it_func_ptr)->func); \
136 } \
137 rcu_read_unlock_sched_notrace(); \
138 } while (0)
139
140
141
142
143
144
145#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
146 extern struct tracepoint __tracepoint_##name; \
147 static inline void trace_##name(proto) \
148 { \
149 JUMP_LABEL(&__tracepoint_##name.state, do_trace); \
150 return; \
151do_trace: \
152 __DO_TRACE(&__tracepoint_##name, \
153 TP_PROTO(data_proto), \
154 TP_ARGS(data_args), \
155 TP_CONDITION(cond)); \
156 } \
157 static inline int \
158 register_trace_##name(void (*probe)(data_proto), void *data) \
159 { \
160 return tracepoint_probe_register(#name, (void *)probe, \
161 data); \
162 } \
163 static inline int \
164 unregister_trace_##name(void (*probe)(data_proto), void *data) \
165 { \
166 return tracepoint_probe_unregister(#name, (void *)probe, \
167 data); \
168 } \
169 static inline void \
170 check_trace_callback_type_##name(void (*cb)(data_proto)) \
171 { \
172 }
173
174
175
176
177
178
179#define DEFINE_TRACE_FN(name, reg, unreg) \
180 static const char __tpstrtab_##name[] \
181 __attribute__((section("__tracepoints_strings"))) = #name; \
182 struct tracepoint __tracepoint_##name \
183 __attribute__((section("__tracepoints"))) = \
184 { __tpstrtab_##name, 0, reg, unreg, NULL }; \
185 static struct tracepoint * const __tracepoint_ptr_##name __used \
186 __attribute__((section("__tracepoints_ptrs"))) = \
187 &__tracepoint_##name;
188
189#define DEFINE_TRACE(name) \
190 DEFINE_TRACE_FN(name, NULL, NULL);
191
192#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \
193 EXPORT_SYMBOL_GPL(__tracepoint_##name)
194#define EXPORT_TRACEPOINT_SYMBOL(name) \
195 EXPORT_SYMBOL(__tracepoint_##name)
196
197#else
198#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
199 static inline void trace_##name(proto) \
200 { } \
201 static inline int \
202 register_trace_##name(void (*probe)(data_proto), \
203 void *data) \
204 { \
205 return -ENOSYS; \
206 } \
207 static inline int \
208 unregister_trace_##name(void (*probe)(data_proto), \
209 void *data) \
210 { \
211 return -ENOSYS; \
212 } \
213 static inline void check_trace_callback_type_##name(void (*cb)(data_proto)) \
214 { \
215 }
216
217#define DEFINE_TRACE_FN(name, reg, unreg)
218#define DEFINE_TRACE(name)
219#define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
220#define EXPORT_TRACEPOINT_SYMBOL(name)
221
222#endif
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238#define DECLARE_TRACE_NOARGS(name) \
239 __DECLARE_TRACE(name, void, , 1, void *__data, __data)
240
241#define DECLARE_TRACE(name, proto, args) \
242 __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1, \
243 PARAMS(void *__data, proto), \
244 PARAMS(__data, args))
245
246#define DECLARE_TRACE_CONDITION(name, proto, args, cond) \
247 __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \
248 PARAMS(void *__data, proto), \
249 PARAMS(__data, args))
250
251#define TRACE_EVENT_FLAGS(event, flag)
252
253#endif
254
255#ifndef TRACE_EVENT
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print)
362#define DEFINE_EVENT(template, name, proto, args) \
363 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
364#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
365 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
366#define DEFINE_EVENT_CONDITION(template, name, proto, \
367 args, cond) \
368 DECLARE_TRACE_CONDITION(name, PARAMS(proto), \
369 PARAMS(args), PARAMS(cond))
370
371#define TRACE_EVENT(name, proto, args, struct, assign, print) \
372 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
373#define TRACE_EVENT_FN(name, proto, args, struct, \
374 assign, print, reg, unreg) \
375 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
376#define TRACE_EVENT_CONDITION(name, proto, args, cond, \
377 struct, assign, print) \
378 DECLARE_TRACE_CONDITION(name, PARAMS(proto), \
379 PARAMS(args), PARAMS(cond))
380
381#define TRACE_EVENT_FLAGS(event, flag)
382
383#endif
384