tracing: Move enabling tracepoints to just after rcu_init()

Enabling tracepoints at boot up can be very useful. The tracepoint
can be initialized right after RCU has been. There's no need to
wait for the early_initcall() to be called. That's too late for some
things that can use tracepoints for debugging. Move the logic to
enable tracepoints out of the initcalls and into init/main.c to
right after rcu_init().

This also allows trace_printk() to be used early too.

Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1412121539300.16494@nanos
Link: http://lkml.kernel.org/r/20141214164104.307127356@goodmis.org

Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Steven Rostedt (Red Hat) 2014-12-12 20:05:10 -05:00 committed by Steven Rostedt
parent aee4e5f3d3
commit 5f893b2639
6 changed files with 40 additions and 8 deletions

View File

@ -39,6 +39,12 @@
# define FTRACE_FORCE_LIST_FUNC 0 # define FTRACE_FORCE_LIST_FUNC 0
#endif #endif
/* Main tracing buffer and events set up */
#ifdef CONFIG_TRACING
void trace_init(void);
#else
static inline void trace_init(void) { }
#endif
struct module; struct module;
struct ftrace_hash; struct ftrace_hash;

View File

@ -577,6 +577,10 @@ asmlinkage __visible void __init start_kernel(void)
local_irq_disable(); local_irq_disable();
idr_init_cache(); idr_init_cache();
rcu_init(); rcu_init();
/* trace_printk() and trace points may be used after this */
trace_init();
context_tracking_init(); context_tracking_init();
radix_tree_init(); radix_tree_init();
/* init some links before init_ISA_irqs() */ /* init some links before init_ISA_irqs() */

View File

@ -6876,6 +6876,13 @@ out:
return ret; return ret;
} }
void __init trace_init(void)
{
tracer_alloc_buffers();
init_ftrace_syscalls();
trace_event_init();
}
__init static int clear_boot_tracer(void) __init static int clear_boot_tracer(void)
{ {
/* /*
@ -6895,6 +6902,5 @@ __init static int clear_boot_tracer(void)
return 0; return 0;
} }
early_initcall(tracer_alloc_buffers);
fs_initcall(tracer_init_debugfs); fs_initcall(tracer_init_debugfs);
late_initcall(clear_boot_tracer); late_initcall(clear_boot_tracer);

View File

@ -1301,4 +1301,17 @@ int perf_ftrace_event_register(struct ftrace_event_call *call,
#define perf_ftrace_event_register NULL #define perf_ftrace_event_register NULL
#endif #endif
#ifdef CONFIG_FTRACE_SYSCALLS
void init_ftrace_syscalls(void);
#else
static inline void init_ftrace_syscalls(void) { }
#endif
#ifdef CONFIG_EVENT_TRACING
void trace_event_init(void);
#else
static inline void __init trace_event_init(void) { }
#endif
#endif /* _LINUX_KERNEL_TRACE_H */ #endif /* _LINUX_KERNEL_TRACE_H */

View File

@ -2477,8 +2477,14 @@ static __init int event_trace_init(void)
#endif #endif
return 0; return 0;
} }
early_initcall(event_trace_memsetup);
core_initcall(event_trace_enable); void __init trace_event_init(void)
{
event_trace_memsetup();
init_ftrace_syscalls();
event_trace_enable();
}
fs_initcall(event_trace_init); fs_initcall(event_trace_init);
#ifdef CONFIG_FTRACE_STARTUP_TEST #ifdef CONFIG_FTRACE_STARTUP_TEST

View File

@ -514,7 +514,7 @@ unsigned long __init __weak arch_syscall_addr(int nr)
return (unsigned long)sys_call_table[nr]; return (unsigned long)sys_call_table[nr];
} }
static int __init init_ftrace_syscalls(void) void __init init_ftrace_syscalls(void)
{ {
struct syscall_metadata *meta; struct syscall_metadata *meta;
unsigned long addr; unsigned long addr;
@ -524,7 +524,7 @@ static int __init init_ftrace_syscalls(void)
GFP_KERNEL); GFP_KERNEL);
if (!syscalls_metadata) { if (!syscalls_metadata) {
WARN_ON(1); WARN_ON(1);
return -ENOMEM; return;
} }
for (i = 0; i < NR_syscalls; i++) { for (i = 0; i < NR_syscalls; i++) {
@ -536,10 +536,7 @@ static int __init init_ftrace_syscalls(void)
meta->syscall_nr = i; meta->syscall_nr = i;
syscalls_metadata[i] = meta; syscalls_metadata[i] = meta;
} }
return 0;
} }
early_initcall(init_ftrace_syscalls);
#ifdef CONFIG_PERF_EVENTS #ifdef CONFIG_PERF_EVENTS