diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-03 13:26:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-03 13:26:31 -0400 |
commit | 68114e5eb862ad0a7a261b91497281b026102715 (patch) | |
tree | 0a7296ab83fd6c33f26010c99151445f49042d6a /include/linux | |
parent | 59ecc26004e77e100c700b1d0da7502b0fdadb46 (diff) | |
parent | 3862807880acc0adaef6749738d210c9f45c3049 (diff) |
Merge tag 'trace-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing updates from Steven Rostedt:
"Most of the changes were largely clean ups, and some documentation.
But there were a few features that were added:
Uprobes now work with event triggers and multi buffers and have
support under ftrace and perf.
The big feature is that the function tracer can now be used within the
multi buffer instances. That is, you can now trace some functions in
one buffer, others in another buffer, all functions in a third buffer
and so on. They are basically agnostic from each other. This only
works for the function tracer and not for the function graph trace,
although you can have the function graph tracer running in the top
level buffer (or any tracer for that matter) and have different
function tracing going on in the sub buffers"
* tag 'trace-3.15' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (45 commits)
tracing: Add BUG_ON when stack end location is over written
tracepoint: Remove unused API functions
Revert "tracing: Move event storage for array from macro to standalone function"
ftrace: Constify ftrace_text_reserved
tracepoints: API doc update to tracepoint_probe_register() return value
tracepoints: API doc update to data argument
ftrace: Fix compilation warning about control_ops_free
ftrace/x86: BUG when ftrace recovery fails
ftrace: Warn on error when modifying ftrace function
ftrace: Remove freelist from struct dyn_ftrace
ftrace: Do not pass data to ftrace_dyn_arch_init
ftrace: Pass retval through return in ftrace_dyn_arch_init()
ftrace: Inline the code from ftrace_dyn_table_alloc()
ftrace: Cleanup of global variables ftrace_new_pgs and ftrace_update_cnt
tracing: Evaluate len expression only once in __dynamic_array macro
tracing: Correctly expand len expressions from __dynamic_array macro
tracing/module: Replace include of tracepoint.h with jump_label.h in module.h
tracing: Fix event header migrate.h to include tracepoint.h
tracing: Fix event header writeback.h to include tracepoint.h
tracing: Warn if a tracepoint is not set via debugfs
...
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/ftrace.h | 27 | ||||
-rw-r--r-- | include/linux/ftrace_event.h | 28 | ||||
-rw-r--r-- | include/linux/module.h | 2 | ||||
-rw-r--r-- | include/linux/tracepoint.h | 18 |
4 files changed, 48 insertions, 27 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index f4233b195dab..9212b017bc72 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -92,6 +92,7 @@ typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip, | |||
92 | * STUB - The ftrace_ops is just a place holder. | 92 | * STUB - The ftrace_ops is just a place holder. |
93 | * INITIALIZED - The ftrace_ops has already been initialized (first use time | 93 | * INITIALIZED - The ftrace_ops has already been initialized (first use time |
94 | * register_ftrace_function() is called, it will initialized the ops) | 94 | * register_ftrace_function() is called, it will initialized the ops) |
95 | * DELETED - The ops are being deleted, do not let them be registered again. | ||
95 | */ | 96 | */ |
96 | enum { | 97 | enum { |
97 | FTRACE_OPS_FL_ENABLED = 1 << 0, | 98 | FTRACE_OPS_FL_ENABLED = 1 << 0, |
@@ -103,13 +104,26 @@ enum { | |||
103 | FTRACE_OPS_FL_RECURSION_SAFE = 1 << 6, | 104 | FTRACE_OPS_FL_RECURSION_SAFE = 1 << 6, |
104 | FTRACE_OPS_FL_STUB = 1 << 7, | 105 | FTRACE_OPS_FL_STUB = 1 << 7, |
105 | FTRACE_OPS_FL_INITIALIZED = 1 << 8, | 106 | FTRACE_OPS_FL_INITIALIZED = 1 << 8, |
107 | FTRACE_OPS_FL_DELETED = 1 << 9, | ||
106 | }; | 108 | }; |
107 | 109 | ||
110 | /* | ||
111 | * Note, ftrace_ops can be referenced outside of RCU protection. | ||
112 | * (Although, for perf, the control ops prevent that). If ftrace_ops is | ||
113 | * allocated and not part of kernel core data, the unregistering of it will | ||
114 | * perform a scheduling on all CPUs to make sure that there are no more users. | ||
115 | * Depending on the load of the system that may take a bit of time. | ||
116 | * | ||
117 | * Any private data added must also take care not to be freed and if private | ||
118 | * data is added to a ftrace_ops that is in core code, the user of the | ||
119 | * ftrace_ops must perform a schedule_on_each_cpu() before freeing it. | ||
120 | */ | ||
108 | struct ftrace_ops { | 121 | struct ftrace_ops { |
109 | ftrace_func_t func; | 122 | ftrace_func_t func; |
110 | struct ftrace_ops *next; | 123 | struct ftrace_ops *next; |
111 | unsigned long flags; | 124 | unsigned long flags; |
112 | int __percpu *disabled; | 125 | int __percpu *disabled; |
126 | void *private; | ||
113 | #ifdef CONFIG_DYNAMIC_FTRACE | 127 | #ifdef CONFIG_DYNAMIC_FTRACE |
114 | struct ftrace_hash *notrace_hash; | 128 | struct ftrace_hash *notrace_hash; |
115 | struct ftrace_hash *filter_hash; | 129 | struct ftrace_hash *filter_hash; |
@@ -285,7 +299,7 @@ extern void | |||
285 | unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops); | 299 | unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops); |
286 | extern void unregister_ftrace_function_probe_all(char *glob); | 300 | extern void unregister_ftrace_function_probe_all(char *glob); |
287 | 301 | ||
288 | extern int ftrace_text_reserved(void *start, void *end); | 302 | extern int ftrace_text_reserved(const void *start, const void *end); |
289 | 303 | ||
290 | extern int ftrace_nr_registered_ops(void); | 304 | extern int ftrace_nr_registered_ops(void); |
291 | 305 | ||
@@ -316,12 +330,9 @@ enum { | |||
316 | #define FTRACE_REF_MAX ((1UL << 29) - 1) | 330 | #define FTRACE_REF_MAX ((1UL << 29) - 1) |
317 | 331 | ||
318 | struct dyn_ftrace { | 332 | struct dyn_ftrace { |
319 | union { | 333 | unsigned long ip; /* address of mcount call-site */ |
320 | unsigned long ip; /* address of mcount call-site */ | ||
321 | struct dyn_ftrace *freelist; | ||
322 | }; | ||
323 | unsigned long flags; | 334 | unsigned long flags; |
324 | struct dyn_arch_ftrace arch; | 335 | struct dyn_arch_ftrace arch; |
325 | }; | 336 | }; |
326 | 337 | ||
327 | int ftrace_force_update(void); | 338 | int ftrace_force_update(void); |
@@ -409,7 +420,7 @@ ftrace_set_early_filter(struct ftrace_ops *ops, char *buf, int enable); | |||
409 | 420 | ||
410 | /* defined in arch */ | 421 | /* defined in arch */ |
411 | extern int ftrace_ip_converted(unsigned long ip); | 422 | extern int ftrace_ip_converted(unsigned long ip); |
412 | extern int ftrace_dyn_arch_init(void *data); | 423 | extern int ftrace_dyn_arch_init(void); |
413 | extern void ftrace_replace_code(int enable); | 424 | extern void ftrace_replace_code(int enable); |
414 | extern int ftrace_update_ftrace_func(ftrace_func_t func); | 425 | extern int ftrace_update_ftrace_func(ftrace_func_t func); |
415 | extern void ftrace_caller(void); | 426 | extern void ftrace_caller(void); |
@@ -541,7 +552,7 @@ static inline __init int unregister_ftrace_command(char *cmd_name) | |||
541 | { | 552 | { |
542 | return -EINVAL; | 553 | return -EINVAL; |
543 | } | 554 | } |
544 | static inline int ftrace_text_reserved(void *start, void *end) | 555 | static inline int ftrace_text_reserved(const void *start, const void *end) |
545 | { | 556 | { |
546 | return 0; | 557 | return 0; |
547 | } | 558 | } |
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 4cdb3a17bcb5..cdc30111d2f8 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h | |||
@@ -163,6 +163,8 @@ void trace_current_buffer_discard_commit(struct ring_buffer *buffer, | |||
163 | 163 | ||
164 | void tracing_record_cmdline(struct task_struct *tsk); | 164 | void tracing_record_cmdline(struct task_struct *tsk); |
165 | 165 | ||
166 | int ftrace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...); | ||
167 | |||
166 | struct event_filter; | 168 | struct event_filter; |
167 | 169 | ||
168 | enum trace_reg { | 170 | enum trace_reg { |
@@ -197,6 +199,32 @@ struct ftrace_event_class { | |||
197 | extern int ftrace_event_reg(struct ftrace_event_call *event, | 199 | extern int ftrace_event_reg(struct ftrace_event_call *event, |
198 | enum trace_reg type, void *data); | 200 | enum trace_reg type, void *data); |
199 | 201 | ||
202 | int ftrace_output_event(struct trace_iterator *iter, struct ftrace_event_call *event, | ||
203 | char *fmt, ...); | ||
204 | |||
205 | int ftrace_event_define_field(struct ftrace_event_call *call, | ||
206 | char *type, int len, char *item, int offset, | ||
207 | int field_size, int sign, int filter); | ||
208 | |||
209 | struct ftrace_event_buffer { | ||
210 | struct ring_buffer *buffer; | ||
211 | struct ring_buffer_event *event; | ||
212 | struct ftrace_event_file *ftrace_file; | ||
213 | void *entry; | ||
214 | unsigned long flags; | ||
215 | int pc; | ||
216 | }; | ||
217 | |||
218 | void *ftrace_event_buffer_reserve(struct ftrace_event_buffer *fbuffer, | ||
219 | struct ftrace_event_file *ftrace_file, | ||
220 | unsigned long len); | ||
221 | |||
222 | void ftrace_event_buffer_commit(struct ftrace_event_buffer *fbuffer); | ||
223 | |||
224 | int ftrace_event_define_field(struct ftrace_event_call *call, | ||
225 | char *type, int len, char *item, int offset, | ||
226 | int field_size, int sign, int filter); | ||
227 | |||
200 | enum { | 228 | enum { |
201 | TRACE_EVENT_FL_FILTERED_BIT, | 229 | TRACE_EVENT_FL_FILTERED_BIT, |
202 | TRACE_EVENT_FL_CAP_ANY_BIT, | 230 | TRACE_EVENT_FL_CAP_ANY_BIT, |
diff --git a/include/linux/module.h b/include/linux/module.h index eaf60ff9ba94..5a5053975114 100644 --- a/include/linux/module.h +++ b/include/linux/module.h | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/stringify.h> | 15 | #include <linux/stringify.h> |
16 | #include <linux/kobject.h> | 16 | #include <linux/kobject.h> |
17 | #include <linux/moduleparam.h> | 17 | #include <linux/moduleparam.h> |
18 | #include <linux/tracepoint.h> | 18 | #include <linux/jump_label.h> |
19 | #include <linux/export.h> | 19 | #include <linux/export.h> |
20 | 20 | ||
21 | #include <linux/percpu.h> | 21 | #include <linux/percpu.h> |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 7159a0a933df..812b2553dfd8 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -48,12 +48,6 @@ extern int tracepoint_probe_register(const char *name, void *probe, void *data); | |||
48 | extern int | 48 | extern int |
49 | tracepoint_probe_unregister(const char *name, void *probe, void *data); | 49 | tracepoint_probe_unregister(const char *name, void *probe, void *data); |
50 | 50 | ||
51 | extern int tracepoint_probe_register_noupdate(const char *name, void *probe, | ||
52 | void *data); | ||
53 | extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe, | ||
54 | void *data); | ||
55 | extern void tracepoint_probe_update_all(void); | ||
56 | |||
57 | #ifdef CONFIG_MODULES | 51 | #ifdef CONFIG_MODULES |
58 | struct tp_module { | 52 | struct tp_module { |
59 | struct list_head list; | 53 | struct list_head list; |
@@ -68,18 +62,6 @@ static inline bool trace_module_has_bad_taint(struct module *mod) | |||
68 | } | 62 | } |
69 | #endif /* CONFIG_MODULES */ | 63 | #endif /* CONFIG_MODULES */ |
70 | 64 | ||
71 | struct tracepoint_iter { | ||
72 | #ifdef CONFIG_MODULES | ||
73 | struct tp_module *module; | ||
74 | #endif /* CONFIG_MODULES */ | ||
75 | struct tracepoint * const *tracepoint; | ||
76 | }; | ||
77 | |||
78 | extern void tracepoint_iter_start(struct tracepoint_iter *iter); | ||
79 | extern void tracepoint_iter_next(struct tracepoint_iter *iter); | ||
80 | extern void tracepoint_iter_stop(struct tracepoint_iter *iter); | ||
81 | extern void tracepoint_iter_reset(struct tracepoint_iter *iter); | ||
82 | |||
83 | /* | 65 | /* |
84 | * tracepoint_synchronize_unregister must be called between the last tracepoint | 66 | * tracepoint_synchronize_unregister must be called between the last tracepoint |
85 | * probe unregistration and the end of module exit to make sure there is no | 67 | * probe unregistration and the end of module exit to make sure there is no |