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 struct jump_label_key key;
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 if (static_branch(&__tracepoint_##name.key)) \
150 __DO_TRACE(&__tracepoint_##name, \
151 TP_PROTO(data_proto), \
152 TP_ARGS(data_args), \
153 TP_CONDITION(cond)); \
154 } \
155 static inline int \
156 register_trace_##name(void (*probe)(data_proto), void *data) \
157 { \
158 return tracepoint_probe_register(#name, (void *)probe, \
159 data); \
160 } \
161 static inline int \
162 unregister_trace_##name(void (*probe)(data_proto), void *data) \
163 { \
164 return tracepoint_probe_unregister(#name, (void *)probe, \
165 data); \
166 } \
167 static inline void \
168 check_trace_callback_type_##name(void (*cb)(data_proto)) \
169 { \
170 }
171
172
173
174
175
176
177#define DEFINE_TRACE_FN(name, reg, unreg) \
178 static const char __tpstrtab_##name[] \
179 __attribute__((section("__tracepoints_strings"))) = #name; \
180 struct tracepoint __tracepoint_##name \
181 __attribute__((section("__tracepoints"))) = \
182 { __tpstrtab_##name, JUMP_LABEL_INIT, reg, unreg, NULL };\
183 static struct tracepoint * const __tracepoint_ptr_##name __used \
184 __attribute__((section("__tracepoints_ptrs"))) = \
185 &__tracepoint_##name;
186
187#define DEFINE_TRACE(name) \
188 DEFINE_TRACE_FN(name, NULL, NULL);
189
190#define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \
191 EXPORT_SYMBOL_GPL(__tracepoint_##name)
192#define EXPORT_TRACEPOINT_SYMBOL(name) \
193 EXPORT_SYMBOL(__tracepoint_##name)
194
195#else
196#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
197 static inline void trace_##name(proto) \
198 { } \
199 static inline int \
200 register_trace_##name(void (*probe)(data_proto), \
201 void *data) \
202 { \
203 return -ENOSYS; \
204 } \
205 static inline int \
206 unregister_trace_##name(void (*probe)(data_proto), \
207 void *data) \
208 { \
209 return -ENOSYS; \
210 } \
211 static inline void check_trace_callback_type_##name(void (*cb)(data_proto)) \
212 { \
213 }
214
215#define DEFINE_TRACE_FN(name, reg, unreg)
216#define DEFINE_TRACE(name)
217#define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
218#define EXPORT_TRACEPOINT_SYMBOL(name)
219
220#endif
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236#define DECLARE_TRACE_NOARGS(name) \
237 __DECLARE_TRACE(name, void, , 1, void *__data, __data)
238
239#define DECLARE_TRACE(name, proto, args) \
240 __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1, \
241 PARAMS(void *__data, proto), \
242 PARAMS(__data, args))
243
244#define DECLARE_TRACE_CONDITION(name, proto, args, cond) \
245 __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \
246 PARAMS(void *__data, proto), \
247 PARAMS(__data, args))
248
249#define TRACE_EVENT_FLAGS(event, flag)
250
251#endif
252
253#ifndef TRACE_EVENT
254
255
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#define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print)
360#define DEFINE_EVENT(template, name, proto, args) \
361 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
362#define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
363 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
364#define DEFINE_EVENT_CONDITION(template, name, proto, \
365 args, cond) \
366 DECLARE_TRACE_CONDITION(name, PARAMS(proto), \
367 PARAMS(args), PARAMS(cond))
368
369#define TRACE_EVENT(name, proto, args, struct, assign, print) \
370 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
371#define TRACE_EVENT_FN(name, proto, args, struct, \
372 assign, print, reg, unreg) \
373 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
374#define TRACE_EVENT_CONDITION(name, proto, args, cond, \
375 struct, assign, print) \
376 DECLARE_TRACE_CONDITION(name, PARAMS(proto), \
377 PARAMS(args), PARAMS(cond))
378
379#define TRACE_EVENT_FLAGS(event, flag)
380
381#endif
382