diff options
Diffstat (limited to 'kernel/trace/trace_functions.c')
| -rw-r--r-- | kernel/trace/trace_functions.c | 15 | 
1 files changed, 14 insertions, 1 deletions
| diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c index 9f1bfbe105e8..3b0cea37e029 100644 --- a/kernel/trace/trace_functions.c +++ b/kernel/trace/trace_functions.c @@ -80,6 +80,7 @@ void ftrace_free_ftrace_ops(struct trace_array *tr)  int ftrace_create_function_files(struct trace_array *tr,  				 struct dentry *parent)  { +	int ret;  	/*  	 * The top level array uses the "global_ops", and the files are  	 * created on boot up. @@ -90,6 +91,12 @@ int ftrace_create_function_files(struct trace_array *tr,  	if (!tr->ops)  		return -EINVAL; +	ret = allocate_fgraph_ops(tr, tr->ops); +	if (ret) { +		kfree(tr->ops); +		return ret; +	} +  	ftrace_create_filter_files(tr->ops, parent);  	return 0; @@ -99,6 +106,7 @@ void ftrace_destroy_function_files(struct trace_array *tr)  {  	ftrace_destroy_filter_files(tr->ops);  	ftrace_free_ftrace_ops(tr); +	free_fgraph_ops(tr);  }  static ftrace_func_t select_trace_function(u32 flags_val) @@ -223,6 +231,7 @@ function_stack_trace_call(unsigned long ip, unsigned long parent_ip,  	long disabled;  	int cpu;  	unsigned int trace_ctx; +	int skip = STACK_SKIP;  	if (unlikely(!tr->function_enabled))  		return; @@ -239,7 +248,11 @@ function_stack_trace_call(unsigned long ip, unsigned long parent_ip,  	if (likely(disabled == 1)) {  		trace_ctx = tracing_gen_ctx_flags(flags);  		trace_function(tr, ip, parent_ip, trace_ctx); -		__trace_stack(tr, trace_ctx, STACK_SKIP); +#ifdef CONFIG_UNWINDER_FRAME_POINTER +		if (ftrace_pids_enabled(op)) +			skip++; +#endif +		__trace_stack(tr, trace_ctx, skip);  	}  	atomic_dec(&data->disabled); |