aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace.c
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-09-29 21:26:16 -0400
committerSteven Rostedt <rostedt@goodmis.org>2011-10-11 09:13:25 -0400
commite0a413f619ef8bc366dafc6f8221674993b8d85f (patch)
treea6696b0e7ef5422490bdbcc28d385c031d3e4eb8 /kernel/trace/trace.c
parente36de1de4a5f95b7cb3e5c37d10e6bbb91833ef0 (diff)
tracing: Warn on output if the function tracer was found corrupted
As the function tracer is very intrusive, lots of self checks are performed on the tracer and if something is found to be strange it will shut itself down keeping it from corrupting the rest of the kernel. This shutdown may still allow functions to be traced, as the tracing only stops new modifications from happening. Trying to stop the function tracer itself can cause more harm as it requires code modification. Although a WARN_ON() is executed, a user may not notice it. To help the user see that something isn't right with the tracing of the system a big warning is added to the output of the tracer that lets the user know that their data may be incomplete. Reported-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel/trace/trace.c')
-rw-r--r--kernel/trace/trace.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 4b8df0dc9358..13f2b8472fed 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -2160,6 +2160,14 @@ void trace_default_header(struct seq_file *m)
2160 } 2160 }
2161} 2161}
2162 2162
2163static void test_ftrace_alive(struct seq_file *m)
2164{
2165 if (!ftrace_is_dead())
2166 return;
2167 seq_printf(m, "# WARNING: FUNCTION TRACING IS CORRUPTED\n");
2168 seq_printf(m, "# MAY BE MISSING FUNCTION EVENTS\n");
2169}
2170
2163static int s_show(struct seq_file *m, void *v) 2171static int s_show(struct seq_file *m, void *v)
2164{ 2172{
2165 struct trace_iterator *iter = v; 2173 struct trace_iterator *iter = v;
@@ -2169,6 +2177,7 @@ static int s_show(struct seq_file *m, void *v)
2169 if (iter->tr) { 2177 if (iter->tr) {
2170 seq_printf(m, "# tracer: %s\n", iter->trace->name); 2178 seq_printf(m, "# tracer: %s\n", iter->trace->name);
2171 seq_puts(m, "#\n"); 2179 seq_puts(m, "#\n");
2180 test_ftrace_alive(m);
2172 } 2181 }
2173 if (iter->trace && iter->trace->print_header) 2182 if (iter->trace && iter->trace->print_header)
2174 iter->trace->print_header(m); 2183 iter->trace->print_header(m);
@@ -4613,6 +4622,12 @@ __ftrace_dump(bool disable_tracing, enum ftrace_dump_mode oops_dump_mode)
4613 4622
4614 tracing_off(); 4623 tracing_off();
4615 4624
4625 /* Did function tracer already get disabled? */
4626 if (ftrace_is_dead()) {
4627 printk("# WARNING: FUNCTION TRACING IS CORRUPTED\n");
4628 printk("# MAY BE MISSING FUNCTION EVENTS\n");
4629 }
4630
4616 if (disable_tracing) 4631 if (disable_tracing)
4617 ftrace_kill(); 4632 ftrace_kill();
4618 4633