tracing: Add tp_printk_stop_on_boot option

Add a kernel command line option that disables printing of events to
console at late_initcall_sync(). This is useful when needing to see
specific events written to console on boot up, but not wanting it when
user space starts, as user space may make the console so noisy that the
system becomes inoperable.
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 8f0901cd
...@@ -5605,12 +5605,25 @@ ...@@ -5605,12 +5605,25 @@
Note, echoing 1 into this file without the Note, echoing 1 into this file without the
tracepoint_printk kernel cmdline option has no effect. tracepoint_printk kernel cmdline option has no effect.
The tp_printk_stop_on_boot (see below) can also be used
to stop the printing of events to console at
late_initcall_sync.
** CAUTION ** ** CAUTION **
Having tracepoints sent to printk() and activating high Having tracepoints sent to printk() and activating high
frequency tracepoints such as irq or sched, can cause frequency tracepoints such as irq or sched, can cause
the system to live lock. the system to live lock.
tp_printk_stop_on_boot[FTRACE]
When tp_printk (above) is set, it can cause a lot of noise
on the console. It may be useful to only include the
printing of events during boot up, as user space may
make the system inoperable.
This command line option will stop the printing of events
to console at the late_initcall_sync() time frame.
traceoff_on_warning traceoff_on_warning
[FTRACE] enable this option to disable tracing when a [FTRACE] enable this option to disable tracing when a
warning is hit. This turns off "tracing_on". Tracing can warning is hit. This turns off "tracing_on". Tracing can
......
...@@ -86,6 +86,7 @@ void __init disable_tracing_selftest(const char *reason) ...@@ -86,6 +86,7 @@ void __init disable_tracing_selftest(const char *reason)
/* Pipe tracepoints to printk */ /* Pipe tracepoints to printk */
struct trace_iterator *tracepoint_print_iter; struct trace_iterator *tracepoint_print_iter;
int tracepoint_printk; int tracepoint_printk;
static bool tracepoint_printk_stop_on_boot __initdata;
static DEFINE_STATIC_KEY_FALSE(tracepoint_printk_key); static DEFINE_STATIC_KEY_FALSE(tracepoint_printk_key);
/* For tracers that don't implement custom flags */ /* For tracers that don't implement custom flags */
...@@ -256,6 +257,13 @@ static int __init set_tracepoint_printk(char *str) ...@@ -256,6 +257,13 @@ static int __init set_tracepoint_printk(char *str)
} }
__setup("tp_printk", set_tracepoint_printk); __setup("tp_printk", set_tracepoint_printk);
static int __init set_tracepoint_printk_stop(char *str)
{
tracepoint_printk_stop_on_boot = true;
return 1;
}
__setup("tp_printk_stop_on_boot", set_tracepoint_printk_stop);
unsigned long long ns2usecs(u64 nsec) unsigned long long ns2usecs(u64 nsec)
{ {
nsec += 500; nsec += 500;
...@@ -9578,6 +9586,8 @@ static __init int tracer_init_tracefs(void) ...@@ -9578,6 +9586,8 @@ static __init int tracer_init_tracefs(void)
return 0; return 0;
} }
fs_initcall(tracer_init_tracefs);
static int trace_panic_handler(struct notifier_block *this, static int trace_panic_handler(struct notifier_block *this,
unsigned long event, void *unused) unsigned long event, void *unused)
{ {
...@@ -9998,7 +10008,7 @@ void __init trace_init(void) ...@@ -9998,7 +10008,7 @@ void __init trace_init(void)
trace_event_init(); trace_event_init();
} }
__init static int clear_boot_tracer(void) __init static void clear_boot_tracer(void)
{ {
/* /*
* The default tracer at boot buffer is an init section. * The default tracer at boot buffer is an init section.
...@@ -10008,26 +10018,21 @@ __init static int clear_boot_tracer(void) ...@@ -10008,26 +10018,21 @@ __init static int clear_boot_tracer(void)
* about to be freed. * about to be freed.
*/ */
if (!default_bootup_tracer) if (!default_bootup_tracer)
return 0; return;
printk(KERN_INFO "ftrace bootup tracer '%s' not registered.\n", printk(KERN_INFO "ftrace bootup tracer '%s' not registered.\n",
default_bootup_tracer); default_bootup_tracer);
default_bootup_tracer = NULL; default_bootup_tracer = NULL;
return 0;
} }
fs_initcall(tracer_init_tracefs);
late_initcall_sync(clear_boot_tracer);
#ifdef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK #ifdef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK
__init static int tracing_set_default_clock(void) __init static void tracing_set_default_clock(void)
{ {
/* sched_clock_stable() is determined in late_initcall */ /* sched_clock_stable() is determined in late_initcall */
if (!trace_boot_clock && !sched_clock_stable()) { if (!trace_boot_clock && !sched_clock_stable()) {
if (security_locked_down(LOCKDOWN_TRACEFS)) { if (security_locked_down(LOCKDOWN_TRACEFS)) {
pr_warn("Can not set tracing clock due to lockdown\n"); pr_warn("Can not set tracing clock due to lockdown\n");
return -EPERM; return;
} }
printk(KERN_WARNING printk(KERN_WARNING
...@@ -10037,8 +10042,21 @@ __init static int tracing_set_default_clock(void) ...@@ -10037,8 +10042,21 @@ __init static int tracing_set_default_clock(void)
"on the kernel command line\n"); "on the kernel command line\n");
tracing_set_clock(&global_trace, "global"); tracing_set_clock(&global_trace, "global");
} }
}
#else
static inline void tracing_set_default_clock(void) { }
#endif
__init static int late_trace_init(void)
{
if (tracepoint_printk && tracepoint_printk_stop_on_boot) {
static_key_disable(&tracepoint_printk_key.key);
tracepoint_printk = 0;
}
tracing_set_default_clock();
clear_boot_tracer();
return 0; return 0;
} }
late_initcall_sync(tracing_set_default_clock);
#endif late_initcall_sync(late_trace_init);
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