This source file includes following definitions.
- trace_module_has_bad_taint
- register_tracepoint_module_notifier
- unregister_tracepoint_module_notifier
- tracepoint_synchronize_unregister
- tracepoint_synchronize_unregister
- tracepoint_ptr_deref
- tracepoint_ptr_deref
1
2 #ifndef _LINUX_TRACEPOINT_H
3 #define _LINUX_TRACEPOINT_H
4
5
6
7
8
9
10
11
12
13
14
15 #include <linux/smp.h>
16 #include <linux/srcu.h>
17 #include <linux/errno.h>
18 #include <linux/types.h>
19 #include <linux/cpumask.h>
20 #include <linux/rcupdate.h>
21 #include <linux/tracepoint-defs.h>
22
23 struct module;
24 struct tracepoint;
25 struct notifier_block;
26
27 struct trace_eval_map {
28 const char *system;
29 const char *eval_string;
30 unsigned long eval_value;
31 };
32
33 #define TRACEPOINT_DEFAULT_PRIO 10
34
35 extern struct srcu_struct tracepoint_srcu;
36
37 extern int
38 tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data);
39 extern int
40 tracepoint_probe_register_prio(struct tracepoint *tp, void *probe, void *data,
41 int prio);
42 extern int
43 tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data);
44 extern void
45 for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
46 void *priv);
47
48 #ifdef CONFIG_MODULES
49 struct tp_module {
50 struct list_head list;
51 struct module *mod;
52 };
53
54 bool trace_module_has_bad_taint(struct module *mod);
55 extern int register_tracepoint_module_notifier(struct notifier_block *nb);
56 extern int unregister_tracepoint_module_notifier(struct notifier_block *nb);
57 #else
58 static inline bool trace_module_has_bad_taint(struct module *mod)
59 {
60 return false;
61 }
62 static inline
63 int register_tracepoint_module_notifier(struct notifier_block *nb)
64 {
65 return 0;
66 }
67 static inline
68 int unregister_tracepoint_module_notifier(struct notifier_block *nb)
69 {
70 return 0;
71 }
72 #endif
73
74
75
76
77
78
79 #ifdef CONFIG_TRACEPOINTS
80 static inline void tracepoint_synchronize_unregister(void)
81 {
82 synchronize_srcu(&tracepoint_srcu);
83 synchronize_rcu();
84 }
85 #else
86 static inline void tracepoint_synchronize_unregister(void)
87 { }
88 #endif
89
90 #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
91 extern int syscall_regfunc(void);
92 extern void syscall_unregfunc(void);
93 #endif
94
95 #define PARAMS(args...) args
96
97 #define TRACE_DEFINE_ENUM(x)
98 #define TRACE_DEFINE_SIZEOF(x)
99
100 #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
101 static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
102 {
103 return offset_to_ptr(p);
104 }
105
106 #define __TRACEPOINT_ENTRY(name) \
107 asm(" .section \"__tracepoints_ptrs\", \"a\" \n" \
108 " .balign 4 \n" \
109 " .long __tracepoint_" #name " - . \n" \
110 " .previous \n")
111 #else
112 static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
113 {
114 return *p;
115 }
116
117 #define __TRACEPOINT_ENTRY(name) \
118 static tracepoint_ptr_t __tracepoint_ptr_##name __used \
119 __attribute__((section("__tracepoints_ptrs"))) = \
120 &__tracepoint_##name
121 #endif
122
123 #endif
124
125
126
127
128
129
130
131
132
133 #ifndef DECLARE_TRACE
134
135 #define TP_PROTO(args...) args
136 #define TP_ARGS(args...) args
137 #define TP_CONDITION(args...) args
138
139
140
141
142
143
144
145
146 #if defined(CONFIG_TRACEPOINTS) && !defined(NOTRACE)
147 #define TRACEPOINTS_ENABLED
148 #endif
149
150 #ifdef TRACEPOINTS_ENABLED
151
152
153
154
155
156
157
158
159
160
161
162 #define __DO_TRACE(tp, proto, args, cond, rcuidle) \
163 do { \
164 struct tracepoint_func *it_func_ptr; \
165 void *it_func; \
166 void *__data; \
167 int __maybe_unused __idx = 0; \
168 \
169 if (!(cond)) \
170 return; \
171 \
172 \
173 WARN_ON_ONCE(rcuidle && in_nmi()); \
174 \
175 \
176 preempt_disable_notrace(); \
177 \
178
179
180
181 \
182 if (rcuidle) { \
183 __idx = srcu_read_lock_notrace(&tracepoint_srcu);\
184 rcu_irq_enter_irqson(); \
185 } \
186 \
187 it_func_ptr = rcu_dereference_raw((tp)->funcs); \
188 \
189 if (it_func_ptr) { \
190 do { \
191 it_func = (it_func_ptr)->func; \
192 __data = (it_func_ptr)->data; \
193 ((void(*)(proto))(it_func))(args); \
194 } while ((++it_func_ptr)->func); \
195 } \
196 \
197 if (rcuidle) { \
198 rcu_irq_exit_irqson(); \
199 srcu_read_unlock_notrace(&tracepoint_srcu, __idx);\
200 } \
201 \
202 preempt_enable_notrace(); \
203 } while (0)
204
205 #ifndef MODULE
206 #define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) \
207 static inline void trace_##name##_rcuidle(proto) \
208 { \
209 if (static_key_false(&__tracepoint_##name.key)) \
210 __DO_TRACE(&__tracepoint_##name, \
211 TP_PROTO(data_proto), \
212 TP_ARGS(data_args), \
213 TP_CONDITION(cond), 1); \
214 }
215 #else
216 #define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args)
217 #endif
218
219
220
221
222
223
224
225
226
227
228
229
230
231 #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
232 extern struct tracepoint __tracepoint_##name; \
233 static inline void trace_##name(proto) \
234 { \
235 if (static_key_false(&__tracepoint_##name.key)) \
236 __DO_TRACE(&__tracepoint_##name, \
237 TP_PROTO(data_proto), \
238 TP_ARGS(data_args), \
239 TP_CONDITION(cond), 0); \
240 if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) { \
241 rcu_read_lock_sched_notrace(); \
242 rcu_dereference_sched(__tracepoint_##name.funcs);\
243 rcu_read_unlock_sched_notrace(); \
244 } \
245 } \
246 __DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args), \
247 PARAMS(cond), PARAMS(data_proto), PARAMS(data_args)) \
248 static inline int \
249 register_trace_##name(void (*probe)(data_proto), void *data) \
250 { \
251 return tracepoint_probe_register(&__tracepoint_##name, \
252 (void *)probe, data); \
253 } \
254 static inline int \
255 register_trace_prio_##name(void (*probe)(data_proto), void *data,\
256 int prio) \
257 { \
258 return tracepoint_probe_register_prio(&__tracepoint_##name, \
259 (void *)probe, data, prio); \
260 } \
261 static inline int \
262 unregister_trace_##name(void (*probe)(data_proto), void *data) \
263 { \
264 return tracepoint_probe_unregister(&__tracepoint_##name,\
265 (void *)probe, data); \
266 } \
267 static inline void \
268 check_trace_callback_type_##name(void (*cb)(data_proto)) \
269 { \
270 } \
271 static inline bool \
272 trace_##name##_enabled(void) \
273 { \
274 return static_key_false(&__tracepoint_##name.key); \
275 }
276
277
278
279
280
281
282 #define DEFINE_TRACE_FN(name, reg, unreg) \
283 static const char __tpstrtab_##name[] \
284 __attribute__((section("__tracepoints_strings"))) = #name; \
285 struct tracepoint __tracepoint_##name \
286 __attribute__((section("__tracepoints"), used)) = \
287 { __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
288 __TRACEPOINT_ENTRY(name);
289
290 #define DEFINE_TRACE(name) \
291 DEFINE_TRACE_FN(name, NULL, NULL);
292
293 #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \
294 EXPORT_SYMBOL_GPL(__tracepoint_##name)
295 #define EXPORT_TRACEPOINT_SYMBOL(name) \
296 EXPORT_SYMBOL(__tracepoint_##name)
297
298 #else
299 #define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
300 static inline void trace_##name(proto) \
301 { } \
302 static inline void trace_##name##_rcuidle(proto) \
303 { } \
304 static inline int \
305 register_trace_##name(void (*probe)(data_proto), \
306 void *data) \
307 { \
308 return -ENOSYS; \
309 } \
310 static inline int \
311 unregister_trace_##name(void (*probe)(data_proto), \
312 void *data) \
313 { \
314 return -ENOSYS; \
315 } \
316 static inline void check_trace_callback_type_##name(void (*cb)(data_proto)) \
317 { \
318 } \
319 static inline bool \
320 trace_##name##_enabled(void) \
321 { \
322 return false; \
323 }
324
325 #define DEFINE_TRACE_FN(name, reg, unreg)
326 #define DEFINE_TRACE(name)
327 #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
328 #define EXPORT_TRACEPOINT_SYMBOL(name)
329
330 #endif
331
332 #ifdef CONFIG_TRACING
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 #define tracepoint_string(str) \
361 ({ \
362 static const char *___tp_str __tracepoint_string = str; \
363 ___tp_str; \
364 })
365 #define __tracepoint_string __attribute__((section("__tracepoint_str")))
366 #else
367
368
369
370
371
372 # define tracepoint_string(str) str
373 # define __tracepoint_string
374 #endif
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390 #define DECLARE_TRACE_NOARGS(name) \
391 __DECLARE_TRACE(name, void, , \
392 cpu_online(raw_smp_processor_id()), \
393 void *__data, __data)
394
395 #define DECLARE_TRACE(name, proto, args) \
396 __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
397 cpu_online(raw_smp_processor_id()), \
398 PARAMS(void *__data, proto), \
399 PARAMS(__data, args))
400
401 #define DECLARE_TRACE_CONDITION(name, proto, args, cond) \
402 __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
403 cpu_online(raw_smp_processor_id()) && (PARAMS(cond)), \
404 PARAMS(void *__data, proto), \
405 PARAMS(__data, args))
406
407 #define TRACE_EVENT_FLAGS(event, flag)
408
409 #define TRACE_EVENT_PERF_PERM(event, expr...)
410
411 #endif
412
413 #ifndef TRACE_EVENT
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519 #define DECLARE_EVENT_CLASS(name, proto, args, tstruct, assign, print)
520 #define DEFINE_EVENT(template, name, proto, args) \
521 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
522 #define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg)\
523 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
524 #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \
525 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
526 #define DEFINE_EVENT_CONDITION(template, name, proto, \
527 args, cond) \
528 DECLARE_TRACE_CONDITION(name, PARAMS(proto), \
529 PARAMS(args), PARAMS(cond))
530
531 #define TRACE_EVENT(name, proto, args, struct, assign, print) \
532 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
533 #define TRACE_EVENT_FN(name, proto, args, struct, \
534 assign, print, reg, unreg) \
535 DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
536 #define TRACE_EVENT_FN_COND(name, proto, args, cond, struct, \
537 assign, print, reg, unreg) \
538 DECLARE_TRACE_CONDITION(name, PARAMS(proto), \
539 PARAMS(args), PARAMS(cond))
540 #define TRACE_EVENT_CONDITION(name, proto, args, cond, \
541 struct, assign, print) \
542 DECLARE_TRACE_CONDITION(name, PARAMS(proto), \
543 PARAMS(args), PARAMS(cond))
544
545 #define TRACE_EVENT_FLAGS(event, flag)
546
547 #define TRACE_EVENT_PERF_PERM(event, expr...)
548
549 #define DECLARE_EVENT_NOP(name, proto, args) \
550 static inline void trace_##name(proto) \
551 { } \
552 static inline bool trace_##name##_enabled(void) \
553 { \
554 return false; \
555 }
556
557 #define TRACE_EVENT_NOP(name, proto, args, struct, assign, print) \
558 DECLARE_EVENT_NOP(name, PARAMS(proto), PARAMS(args))
559
560 #define DECLARE_EVENT_CLASS_NOP(name, proto, args, tstruct, assign, print)
561 #define DEFINE_EVENT_NOP(template, name, proto, args) \
562 DECLARE_EVENT_NOP(name, PARAMS(proto), PARAMS(args))
563
564 #endif