diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2008-12-05 21:43:41 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-12-08 09:11:45 -0500 |
commit | 380c4b1411ccd6885f92b2c8ceb08433a720f44e (patch) | |
tree | f3b571e1caff2de3e6b4cace87c2b1ec332667d7 /include | |
parent | 8e1b82e0866befaa0b2920be296c6e4c3fc7f422 (diff) |
tracing/function-graph-tracer: append the tracing_graph_flag
Impact: Provide a way to pause the function graph tracer
As suggested by Steven Rostedt, the previous patch that prevented from
spinlock function tracing shouldn't use the raw_spinlock to fix it.
It's much better to follow lockdep with normal spinlock, so this patch
adds a new flag for each task to make the function graph tracer able
to be paused. We also can send an ftrace_printk whithout worrying of
the irrelevant traced spinlock during insertion.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/ftrace.h | 13 | ||||
-rw-r--r-- | include/linux/sched.h | 2 |
2 files changed, 15 insertions, 0 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 449fa8e9e34f..11cac81eed08 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -401,6 +401,16 @@ static inline int task_curr_ret_stack(struct task_struct *t) | |||
401 | { | 401 | { |
402 | return t->curr_ret_stack; | 402 | return t->curr_ret_stack; |
403 | } | 403 | } |
404 | |||
405 | static inline void pause_graph_tracing(void) | ||
406 | { | ||
407 | atomic_inc(¤t->tracing_graph_pause); | ||
408 | } | ||
409 | |||
410 | static inline void unpause_graph_tracing(void) | ||
411 | { | ||
412 | atomic_dec(¤t->tracing_graph_pause); | ||
413 | } | ||
404 | #else | 414 | #else |
405 | 415 | ||
406 | #define __notrace_funcgraph | 416 | #define __notrace_funcgraph |
@@ -412,6 +422,9 @@ static inline int task_curr_ret_stack(struct task_struct *tsk) | |||
412 | { | 422 | { |
413 | return -1; | 423 | return -1; |
414 | } | 424 | } |
425 | |||
426 | static inline void pause_graph_tracing(void) { } | ||
427 | static inline void unpause_graph_tracing(void) { } | ||
415 | #endif | 428 | #endif |
416 | 429 | ||
417 | #ifdef CONFIG_TRACING | 430 | #ifdef CONFIG_TRACING |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 4c152e0acc9e..4b81fc5f7731 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1379,6 +1379,8 @@ struct task_struct { | |||
1379 | * because of depth overrun. | 1379 | * because of depth overrun. |
1380 | */ | 1380 | */ |
1381 | atomic_t trace_overrun; | 1381 | atomic_t trace_overrun; |
1382 | /* Pause for the tracing */ | ||
1383 | atomic_t tracing_graph_pause; | ||
1382 | #endif | 1384 | #endif |
1383 | #ifdef CONFIG_TRACING | 1385 | #ifdef CONFIG_TRACING |
1384 | /* state flags for use by tracers */ | 1386 | /* state flags for use by tracers */ |