diff options
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 |
