Commit 501c2375 authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Steven Rostedt

ftrace: Move toplevel init out of ftrace_init_tracefs()

Commit 345ddcc8 ("ftrace: Have set_ftrace_pid use the bitmap like events
do") placed ftrace_init_tracefs into the instance creation, and encapsulated
the top level updating with an if conditional, as the top level only gets
updated at boot up. Unfortunately, this triggers section mismatch errors as
the init functions are called from a function that can be called later, and
the section mismatch logic is unaware of the if conditional that would
prevent it from happening at run time.

To make everyone happy, create a separate ftrace_init_tracefs_toplevel()
routine that only gets called by init functions, and this will be what calls
other init functions for the toplevel directory.

Link: http://lkml.kernel.org/r/20160704102139.19cbc0d9@gandalf.local.homeReported-by: default avatarkbuild test robot <fengguang.wu@intel.com>
Reported-by: default avatarArnd Bergmann <arnd@arndb.de>
Fixes: 345ddcc8 ("ftrace: Have set_ftrace_pid use the bitmap like events do")
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 7fa8b717
...@@ -5539,16 +5539,20 @@ static const struct file_operations ftrace_pid_fops = { ...@@ -5539,16 +5539,20 @@ static const struct file_operations ftrace_pid_fops = {
void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer) void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer)
{ {
/* Only the top level directory has the dyn_tracefs and profile */
if (tr->flags & TRACE_ARRAY_FL_GLOBAL) {
ftrace_init_dyn_tracefs(d_tracer);
ftrace_profile_tracefs(d_tracer);
}
trace_create_file("set_ftrace_pid", 0644, d_tracer, trace_create_file("set_ftrace_pid", 0644, d_tracer,
tr, &ftrace_pid_fops); tr, &ftrace_pid_fops);
} }
void __init ftrace_init_tracefs_toplevel(struct trace_array *tr,
struct dentry *d_tracer)
{
/* Only the top level directory has the dyn_tracefs and profile */
WARN_ON(!(tr->flags & TRACE_ARRAY_FL_GLOBAL));
ftrace_init_dyn_tracefs(d_tracer);
ftrace_profile_tracefs(d_tracer);
}
/** /**
* ftrace_kill - kill ftrace * ftrace_kill - kill ftrace
* *
......
...@@ -7369,6 +7369,7 @@ static __init int tracer_init_tracefs(void) ...@@ -7369,6 +7369,7 @@ static __init int tracer_init_tracefs(void)
return 0; return 0;
init_tracer_tracefs(&global_trace, d_tracer); init_tracer_tracefs(&global_trace, d_tracer);
ftrace_init_tracefs_toplevel(&global_trace, d_tracer);
trace_create_file("tracing_thresh", 0644, d_tracer, trace_create_file("tracing_thresh", 0644, d_tracer,
&global_trace, &tracing_thresh_fops); &global_trace, &tracing_thresh_fops);
......
...@@ -857,6 +857,8 @@ void ftrace_init_array_ops(struct trace_array *tr, ftrace_func_t func); ...@@ -857,6 +857,8 @@ void ftrace_init_array_ops(struct trace_array *tr, ftrace_func_t func);
void ftrace_reset_array_ops(struct trace_array *tr); void ftrace_reset_array_ops(struct trace_array *tr);
int using_ftrace_ops_list_func(void); int using_ftrace_ops_list_func(void);
void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer); void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer);
void ftrace_init_tracefs_toplevel(struct trace_array *tr,
struct dentry *d_tracer);
#else #else
static inline int ftrace_trace_task(struct trace_array *tr) static inline int ftrace_trace_task(struct trace_array *tr)
{ {
...@@ -874,6 +876,7 @@ static inline __init void ...@@ -874,6 +876,7 @@ static inline __init void
ftrace_init_global_array_ops(struct trace_array *tr) { } ftrace_init_global_array_ops(struct trace_array *tr) { }
static inline void ftrace_reset_array_ops(struct trace_array *tr) { } static inline void ftrace_reset_array_ops(struct trace_array *tr) { }
static inline void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d) { } static inline void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d) { }
static inline void ftrace_init_tracefs_toplevel(struct trace_array *tr, struct dentry *d) { }
/* ftace_func_t type is not defined, use macro instead of static inline */ /* ftace_func_t type is not defined, use macro instead of static inline */
#define ftrace_init_array_ops(tr, func) do { } while (0) #define ftrace_init_array_ops(tr, func) do { } while (0)
#endif /* CONFIG_FUNCTION_TRACER */ #endif /* CONFIG_FUNCTION_TRACER */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment