diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-08-26 02:29:02 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-08-26 02:29:02 -0400 |
| commit | 35dce1a99d010f3d738af4ce1b9b77302fdfe69c (patch) | |
| tree | e34a37de965a79a2ae301de4d0557f500111dde6 /include | |
| parent | 7cb2e3ee2aeec5b83ecadba929a2dc575dd4008f (diff) | |
| parent | 1c569f0264ea629c10bbab471dd0626ce4d3f19f (diff) | |
Merge branch 'tracing/core' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into tracing/core
Conflicts:
include/linux/tracepoint.h
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/tracepoint.h | 46 | ||||
| -rw-r--r-- | include/trace/define_trace.h | 5 | ||||
| -rw-r--r-- | include/trace/events/syscalls.h | 70 | ||||
| -rw-r--r-- | include/trace/ftrace.h | 9 | ||||
| -rw-r--r-- | include/trace/syscall.h | 17 |
5 files changed, 102 insertions, 45 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 0341f2e2698a..63a3f7a80580 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -23,6 +23,8 @@ struct tracepoint; | |||
| 23 | struct tracepoint { | 23 | struct tracepoint { |
| 24 | const char *name; /* Tracepoint name */ | 24 | const char *name; /* Tracepoint name */ |
| 25 | int state; /* State. */ | 25 | int state; /* State. */ |
| 26 | void (*regfunc)(void); | ||
| 27 | void (*unregfunc)(void); | ||
| 26 | void **funcs; | 28 | void **funcs; |
| 27 | } __attribute__((aligned(32))); /* | 29 | } __attribute__((aligned(32))); /* |
| 28 | * Aligned on 32 bytes because it is | 30 | * Aligned on 32 bytes because it is |
| @@ -60,10 +62,8 @@ struct tracepoint { | |||
| 60 | * Make sure the alignment of the structure in the __tracepoints section will | 62 | * Make sure the alignment of the structure in the __tracepoints section will |
| 61 | * not add unwanted padding between the beginning of the section and the | 63 | * not add unwanted padding between the beginning of the section and the |
| 62 | * structure. Force alignment to the same alignment as the section start. | 64 | * structure. Force alignment to the same alignment as the section start. |
| 63 | * An optional set of (un)registration functions can be passed to perform any | ||
| 64 | * additional (un)registration work. | ||
| 65 | */ | 65 | */ |
| 66 | #define DECLARE_TRACE_WITH_CALLBACK(name, proto, args, reg, unreg) \ | 66 | #define DECLARE_TRACE(name, proto, args) \ |
| 67 | extern struct tracepoint __tracepoint_##name; \ | 67 | extern struct tracepoint __tracepoint_##name; \ |
| 68 | static inline void trace_##name(proto) \ | 68 | static inline void trace_##name(proto) \ |
| 69 | { \ | 69 | { \ |
| @@ -73,36 +73,23 @@ struct tracepoint { | |||
| 73 | } \ | 73 | } \ |
| 74 | static inline int register_trace_##name(void (*probe)(proto)) \ | 74 | static inline int register_trace_##name(void (*probe)(proto)) \ |
| 75 | { \ | 75 | { \ |
| 76 | int ret; \ | 76 | return tracepoint_probe_register(#name, (void *)probe); \ |
| 77 | void (*func)(void) = reg; \ | ||
| 78 | \ | ||
| 79 | ret = tracepoint_probe_register(#name, (void *)probe); \ | ||
| 80 | if (func && !ret) \ | ||
| 81 | func(); \ | ||
| 82 | return ret; \ | ||
| 83 | } \ | 77 | } \ |
| 84 | static inline int unregister_trace_##name(void (*probe)(proto)) \ | 78 | static inline int unregister_trace_##name(void (*probe)(proto)) \ |
| 85 | { \ | 79 | { \ |
| 86 | int ret; \ | 80 | return tracepoint_probe_unregister(#name, (void *)probe);\ |
| 87 | void (*func)(void) = unreg; \ | ||
| 88 | \ | ||
| 89 | ret = tracepoint_probe_unregister(#name, (void *)probe);\ | ||
| 90 | if (func && !ret) \ | ||
| 91 | func(); \ | ||
| 92 | return ret; \ | ||
| 93 | } | 81 | } |
| 94 | 82 | ||
| 95 | 83 | ||
| 96 | #define DECLARE_TRACE(name, proto, args) \ | 84 | #define DEFINE_TRACE_FN(name, reg, unreg) \ |
| 97 | DECLARE_TRACE_WITH_CALLBACK(name, TP_PROTO(proto), TP_ARGS(args),\ | ||
| 98 | NULL, NULL); | ||
| 99 | |||
| 100 | #define DEFINE_TRACE(name) \ | ||
| 101 | static const char __tpstrtab_##name[] \ | 85 | static const char __tpstrtab_##name[] \ |
| 102 | __attribute__((section("__tracepoints_strings"))) = #name; \ | 86 | __attribute__((section("__tracepoints_strings"))) = #name; \ |
| 103 | struct tracepoint __tracepoint_##name \ | 87 | struct tracepoint __tracepoint_##name \ |
| 104 | __attribute__((section("__tracepoints"), aligned(32))) = \ | 88 | __attribute__((section("__tracepoints"), aligned(32))) = \ |
| 105 | { __tpstrtab_##name, 0, NULL } | 89 | { __tpstrtab_##name, 0, reg, unreg, NULL } |
| 90 | |||
| 91 | #define DEFINE_TRACE(name) \ | ||
| 92 | DEFINE_TRACE_FN(name, NULL, NULL); | ||
| 106 | 93 | ||
| 107 | #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \ | 94 | #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) \ |
| 108 | EXPORT_SYMBOL_GPL(__tracepoint_##name) | 95 | EXPORT_SYMBOL_GPL(__tracepoint_##name) |
| @@ -113,7 +100,7 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin, | |||
| 113 | struct tracepoint *end); | 100 | struct tracepoint *end); |
| 114 | 101 | ||
| 115 | #else /* !CONFIG_TRACEPOINTS */ | 102 | #else /* !CONFIG_TRACEPOINTS */ |
| 116 | #define DECLARE_TRACE_WITH_CALLBACK(name, proto, args, reg, unreg) \ | 103 | #define DECLARE_TRACE(name, proto, args) \ |
| 117 | static inline void _do_trace_##name(struct tracepoint *tp, proto) \ | 104 | static inline void _do_trace_##name(struct tracepoint *tp, proto) \ |
| 118 | { } \ | 105 | { } \ |
| 119 | static inline void trace_##name(proto) \ | 106 | static inline void trace_##name(proto) \ |
| @@ -127,10 +114,7 @@ extern void tracepoint_update_probe_range(struct tracepoint *begin, | |||
| 127 | return -ENOSYS; \ | 114 | return -ENOSYS; \ |
| 128 | } | 115 | } |
| 129 | 116 | ||
| 130 | #define DECLARE_TRACE(name, proto, args) \ | 117 | #define DEFINE_TRACE_FN(name, reg, unreg) |
| 131 | DECLARE_TRACE_WITH_CALLBACK(name, TP_PROTO(proto), TP_ARGS(args),\ | ||
| 132 | NULL, NULL); | ||
| 133 | |||
| 134 | #define DEFINE_TRACE(name) | 118 | #define DEFINE_TRACE(name) |
| 135 | #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) | 119 | #define EXPORT_TRACEPOINT_SYMBOL_GPL(name) |
| 136 | #define EXPORT_TRACEPOINT_SYMBOL(name) | 120 | #define EXPORT_TRACEPOINT_SYMBOL(name) |
| @@ -291,9 +275,15 @@ static inline void tracepoint_synchronize_unregister(void) | |||
| 291 | * can also by used by generic instrumentation like SystemTap), and | 275 | * can also by used by generic instrumentation like SystemTap), and |
| 292 | * it is also used to expose a structured trace record in | 276 | * it is also used to expose a structured trace record in |
| 293 | * /sys/kernel/debug/tracing/events/. | 277 | * /sys/kernel/debug/tracing/events/. |
| 278 | * | ||
| 279 | * A set of (un)registration functions can be passed to the variant | ||
| 280 | * TRACE_EVENT_FN to perform any (un)registration work. | ||
| 294 | */ | 281 | */ |
| 295 | 282 | ||
| 296 | #define TRACE_EVENT(name, proto, args, struct, assign, print) \ | 283 | #define TRACE_EVENT(name, proto, args, struct, assign, print) \ |
| 297 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) | 284 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) |
| 285 | #define TRACE_EVENT_FN(name, proto, args, struct, \ | ||
| 286 | assign, print, reg, unreg) \ | ||
| 287 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args)) | ||
| 298 | 288 | ||
| 299 | #endif /* ifdef TRACE_EVENT (see note above) */ | 289 | #endif /* ifdef TRACE_EVENT (see note above) */ |
diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h index cd150b9d8e32..a89ed590597a 100644 --- a/include/trace/define_trace.h +++ b/include/trace/define_trace.h | |||
| @@ -26,6 +26,11 @@ | |||
| 26 | #define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ | 26 | #define TRACE_EVENT(name, proto, args, tstruct, assign, print) \ |
| 27 | DEFINE_TRACE(name) | 27 | DEFINE_TRACE(name) |
| 28 | 28 | ||
| 29 | #undef TRACE_EVENT_FN | ||
| 30 | #define TRACE_EVENT_FN(name, proto, args, tstruct, \ | ||
| 31 | assign, print, reg, unreg) \ | ||
| 32 | DEFINE_TRACE_FN(name, reg, unreg) | ||
| 33 | |||
| 29 | #undef DECLARE_TRACE | 34 | #undef DECLARE_TRACE |
| 30 | #define DECLARE_TRACE(name, proto, args) \ | 35 | #define DECLARE_TRACE(name, proto, args) \ |
| 31 | DEFINE_TRACE(name) | 36 | DEFINE_TRACE(name) |
diff --git a/include/trace/events/syscalls.h b/include/trace/events/syscalls.h new file mode 100644 index 000000000000..397dff2dbd5a --- /dev/null +++ b/include/trace/events/syscalls.h | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | #undef TRACE_SYSTEM | ||
| 2 | #define TRACE_SYSTEM syscalls | ||
| 3 | |||
| 4 | #if !defined(_TRACE_EVENTS_SYSCALLS_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 5 | #define _TRACE_EVENTS_SYSCALLS_H | ||
| 6 | |||
| 7 | #include <linux/tracepoint.h> | ||
| 8 | |||
| 9 | #include <asm/ptrace.h> | ||
| 10 | #include <asm/syscall.h> | ||
| 11 | |||
| 12 | |||
| 13 | #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS | ||
| 14 | |||
| 15 | extern void syscall_regfunc(void); | ||
| 16 | extern void syscall_unregfunc(void); | ||
| 17 | |||
| 18 | TRACE_EVENT_FN(sys_enter, | ||
| 19 | |||
| 20 | TP_PROTO(struct pt_regs *regs, long id), | ||
| 21 | |||
| 22 | TP_ARGS(regs, id), | ||
| 23 | |||
| 24 | TP_STRUCT__entry( | ||
| 25 | __field( long, id ) | ||
| 26 | __array( unsigned long, args, 6 ) | ||
| 27 | ), | ||
| 28 | |||
| 29 | TP_fast_assign( | ||
| 30 | __entry->id = id; | ||
| 31 | syscall_get_arguments(current, regs, 0, 6, __entry->args); | ||
| 32 | ), | ||
| 33 | |||
| 34 | TP_printk("NR %ld (%lx, %lx, %lx, %lx, %lx, %lx)", | ||
| 35 | __entry->id, | ||
| 36 | __entry->args[0], __entry->args[1], __entry->args[2], | ||
| 37 | __entry->args[3], __entry->args[4], __entry->args[5]), | ||
| 38 | |||
| 39 | syscall_regfunc, syscall_unregfunc | ||
| 40 | ); | ||
| 41 | |||
| 42 | TRACE_EVENT_FN(sys_exit, | ||
| 43 | |||
| 44 | TP_PROTO(struct pt_regs *regs, long ret), | ||
| 45 | |||
| 46 | TP_ARGS(regs, ret), | ||
| 47 | |||
| 48 | TP_STRUCT__entry( | ||
| 49 | __field( long, id ) | ||
| 50 | __field( long, ret ) | ||
| 51 | ), | ||
| 52 | |||
| 53 | TP_fast_assign( | ||
| 54 | __entry->id = syscall_get_nr(current, regs); | ||
| 55 | __entry->ret = ret; | ||
| 56 | ), | ||
| 57 | |||
| 58 | TP_printk("NR %ld = %ld", | ||
| 59 | __entry->id, __entry->ret), | ||
| 60 | |||
| 61 | syscall_regfunc, syscall_unregfunc | ||
| 62 | ); | ||
| 63 | |||
| 64 | #endif /* CONFIG_HAVE_SYSCALL_TRACEPOINTS */ | ||
| 65 | |||
| 66 | #endif /* _TRACE_EVENTS_SYSCALLS_H */ | ||
| 67 | |||
| 68 | /* This part must be outside protection */ | ||
| 69 | #include <trace/define_trace.h> | ||
| 70 | |||
diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 1b1f742a6045..360a77ad79e1 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h | |||
| @@ -45,6 +45,15 @@ | |||
| 45 | }; \ | 45 | }; \ |
| 46 | static struct ftrace_event_call event_##name | 46 | static struct ftrace_event_call event_##name |
| 47 | 47 | ||
| 48 | /* Callbacks are meaningless to ftrace. */ | ||
| 49 | #undef TRACE_EVENT_FN | ||
| 50 | #define TRACE_EVENT_FN(name, proto, args, tstruct, \ | ||
| 51 | assign, print, reg, unreg) \ | ||
| 52 | TRACE_EVENT(name, TP_PROTO(proto), TP_ARGS(args), \ | ||
| 53 | TP_STRUCT__entry(tstruct), \ | ||
| 54 | TP_fast_assign(assign), \ | ||
| 55 | TP_printk(print)) | ||
| 56 | |||
| 48 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) | 57 | #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) |
| 49 | 58 | ||
| 50 | 59 | ||
diff --git a/include/trace/syscall.h b/include/trace/syscall.h index 9661dd406b93..5dc283ba5ae0 100644 --- a/include/trace/syscall.h +++ b/include/trace/syscall.h | |||
| @@ -8,23 +8,6 @@ | |||
| 8 | #include <asm/ptrace.h> | 8 | #include <asm/ptrace.h> |
| 9 | 9 | ||
| 10 | 10 | ||
| 11 | extern void syscall_regfunc(void); | ||
| 12 | extern void syscall_unregfunc(void); | ||
| 13 | |||
| 14 | DECLARE_TRACE_WITH_CALLBACK(syscall_enter, | ||
| 15 | TP_PROTO(struct pt_regs *regs, long id), | ||
| 16 | TP_ARGS(regs, id), | ||
| 17 | syscall_regfunc, | ||
| 18 | syscall_unregfunc | ||
| 19 | ); | ||
| 20 | |||
| 21 | DECLARE_TRACE_WITH_CALLBACK(syscall_exit, | ||
| 22 | TP_PROTO(struct pt_regs *regs, long ret), | ||
| 23 | TP_ARGS(regs, ret), | ||
| 24 | syscall_regfunc, | ||
| 25 | syscall_unregfunc | ||
| 26 | ); | ||
| 27 | |||
| 28 | /* | 11 | /* |
| 29 | * A syscall entry in the ftrace syscalls array. | 12 | * A syscall entry in the ftrace syscalls array. |
| 30 | * | 13 | * |
