diff options
Diffstat (limited to 'include/linux/ftrace.h')
| -rw-r--r-- | include/linux/ftrace.h | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 31ea4b428360..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 | } |
| @@ -570,8 +581,6 @@ static inline int | |||
| 570 | ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; } | 581 | ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; } |
| 571 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 582 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
| 572 | 583 | ||
| 573 | loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence); | ||
| 574 | |||
| 575 | /* totally disable ftrace - can not re-enable after this */ | 584 | /* totally disable ftrace - can not re-enable after this */ |
| 576 | void ftrace_kill(void); | 585 | void ftrace_kill(void); |
| 577 | 586 | ||
