diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index ebff62ef40be..20e066065eb3 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -2739,15 +2739,20 @@ void unregister_ftrace_graph(void) | |||
2739 | void ftrace_graph_init_task(struct task_struct *t) | 2739 | void ftrace_graph_init_task(struct task_struct *t) |
2740 | { | 2740 | { |
2741 | if (atomic_read(&ftrace_graph_active)) { | 2741 | if (atomic_read(&ftrace_graph_active)) { |
2742 | t->ret_stack = kmalloc(FTRACE_RETFUNC_DEPTH | 2742 | struct ftrace_ret_stack *ret_stack; |
2743 | |||
2744 | ret_stack = kmalloc(FTRACE_RETFUNC_DEPTH | ||
2743 | * sizeof(struct ftrace_ret_stack), | 2745 | * sizeof(struct ftrace_ret_stack), |
2744 | GFP_KERNEL); | 2746 | GFP_KERNEL); |
2745 | if (!t->ret_stack) | 2747 | if (!ret_stack) |
2746 | return; | 2748 | return; |
2747 | t->curr_ret_stack = -1; | 2749 | t->curr_ret_stack = -1; |
2748 | atomic_set(&t->tracing_graph_pause, 0); | 2750 | atomic_set(&t->tracing_graph_pause, 0); |
2749 | atomic_set(&t->trace_overrun, 0); | 2751 | atomic_set(&t->trace_overrun, 0); |
2750 | t->ftrace_timestamp = 0; | 2752 | t->ftrace_timestamp = 0; |
2753 | /* make curr_ret_stack visable before we add the ret_stack */ | ||
2754 | smp_wmb(); | ||
2755 | t->ret_stack = ret_stack; | ||
2751 | } else | 2756 | } else |
2752 | t->ret_stack = NULL; | 2757 | t->ret_stack = NULL; |
2753 | } | 2758 | } |