diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-11-12 04:17:09 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-11-12 04:17:09 -0500 |
commit | 60a011c736e7dd09a0b01ca6a051a416f3f52ffb (patch) | |
tree | 20e91db58c3bbfa622d3ed8ec747e4974a807284 /include | |
parent | d06bbd669539215405874d8fe32ab65105e6c4bb (diff) | |
parent | 19b3e9671c5a219b8c34da2cc66e0ce7c3a501ae (diff) |
Merge branch 'tracing/function-return-tracer' into tracing/fastboot
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/ftrace.h | 20 | ||||
-rw-r--r-- | include/linux/ftrace_irq.h | 2 | ||||
-rw-r--r-- | include/linux/sched.h | 11 |
3 files changed, 32 insertions, 1 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 1f5608c11023..dcbbf72a88b1 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -268,6 +268,26 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { } | |||
268 | 268 | ||
269 | 269 | ||
270 | /* | 270 | /* |
271 | * Structure that defines a return function trace. | ||
272 | */ | ||
273 | struct ftrace_retfunc { | ||
274 | unsigned long ret; /* Return address */ | ||
275 | unsigned long func; /* Current function */ | ||
276 | unsigned long long calltime; | ||
277 | unsigned long long rettime; | ||
278 | }; | ||
279 | |||
280 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
281 | /* Type of a callback handler of tracing return function */ | ||
282 | typedef void (*trace_function_return_t)(struct ftrace_retfunc *); | ||
283 | |||
284 | extern void register_ftrace_return(trace_function_return_t func); | ||
285 | /* The current handler in use */ | ||
286 | extern trace_function_return_t ftrace_function_return; | ||
287 | extern void unregister_ftrace_return(void); | ||
288 | #endif | ||
289 | |||
290 | /* | ||
271 | * Structure which defines the trace of an initcall. | 291 | * Structure which defines the trace of an initcall. |
272 | * You don't have to fill the func field since it is | 292 | * You don't have to fill the func field since it is |
273 | * only used internally by the tracer. | 293 | * only used internally by the tracer. |
diff --git a/include/linux/ftrace_irq.h b/include/linux/ftrace_irq.h index b1299d6729f2..0b4df55d7a74 100644 --- a/include/linux/ftrace_irq.h +++ b/include/linux/ftrace_irq.h | |||
@@ -2,7 +2,7 @@ | |||
2 | #define _LINUX_FTRACE_IRQ_H | 2 | #define _LINUX_FTRACE_IRQ_H |
3 | 3 | ||
4 | 4 | ||
5 | #ifdef CONFIG_DYNAMIC_FTRACE | 5 | #if defined(CONFIG_DYNAMIC_FTRACE) || defined(CONFIG_FUNCTION_RET_TRACER) |
6 | extern void ftrace_nmi_enter(void); | 6 | extern void ftrace_nmi_enter(void); |
7 | extern void ftrace_nmi_exit(void); | 7 | extern void ftrace_nmi_exit(void); |
8 | #else | 8 | #else |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 644ffbda17ca..61c8cc36028a 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2006,6 +2006,17 @@ static inline void setup_thread_stack(struct task_struct *p, struct task_struct | |||
2006 | { | 2006 | { |
2007 | *task_thread_info(p) = *task_thread_info(org); | 2007 | *task_thread_info(p) = *task_thread_info(org); |
2008 | task_thread_info(p)->task = p; | 2008 | task_thread_info(p)->task = p; |
2009 | |||
2010 | #ifdef CONFIG_FUNCTION_RET_TRACER | ||
2011 | /* | ||
2012 | * When fork() creates a child process, this function is called. | ||
2013 | * But the child task may not inherit the return adresses traced | ||
2014 | * by the return function tracer because it will directly execute | ||
2015 | * in userspace and will not return to kernel functions its parent | ||
2016 | * used. | ||
2017 | */ | ||
2018 | task_thread_info(p)->curr_ret_stack = -1; | ||
2019 | #endif | ||
2009 | } | 2020 | } |
2010 | 2021 | ||
2011 | static inline unsigned long *end_of_stack(struct task_struct *p) | 2022 | static inline unsigned long *end_of_stack(struct task_struct *p) |