tracing/function-graph-tracer: provide a selftest for the function graph tracer
authorFrederic Weisbecker <fweisbec@gmail.com>
Sat, 7 Feb 2009 20:33:57 +0000 (21:33 +0100)
committerIngo Molnar <mingo@elte.hu>
Mon, 9 Feb 2009 09:51:37 +0000 (10:51 +0100)
Making it more easy to do a basic regression test for this tracer.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/trace/trace.h
kernel/trace/trace_functions_graph.c
kernel/trace/trace_selftest.c

index b9838f4a69292b2cc55930b7b5beaf285be87291..a011ec06222597f0f369351d9a0e389052bd2f3c 100644 (file)
@@ -500,6 +500,8 @@ extern int DYN_FTRACE_TEST_NAME(void);
 #ifdef CONFIG_FTRACE_STARTUP_TEST
 extern int trace_selftest_startup_function(struct tracer *trace,
                                           struct trace_array *tr);
+extern int trace_selftest_startup_function_graph(struct tracer *trace,
+                                                struct trace_array *tr);
 extern int trace_selftest_startup_irqsoff(struct tracer *trace,
                                          struct trace_array *tr);
 extern int trace_selftest_startup_preemptoff(struct tracer *trace,
index 222f97d336a6861587d510805bae6bd6bd4c0aec..88f8d9d80a931e1fedf89b710e236298d7d8f90b 100644 (file)
@@ -750,6 +750,9 @@ static struct tracer graph_trace __read_mostly = {
        .print_line     = print_graph_function,
        .print_header   = print_graph_headers,
        .flags          = &tracer_flags,
+#ifdef CONFIG_FTRACE_SELFTEST
+       .selftest       = trace_selftest_startup_function_graph,
+#endif
 };
 
 static __init int init_graph_trace(void)
index 445700e51f6d4bffb301cf51755db31cd65c16af..0c9aa1457e51f729ee740bb78cccbd392c8b13d1 100644 (file)
@@ -13,6 +13,8 @@ static inline int trace_valid_entry(struct trace_entry *entry)
        case TRACE_PRINT:
        case TRACE_SPECIAL:
        case TRACE_BRANCH:
+       case TRACE_GRAPH_ENT:
+       case TRACE_GRAPH_RET:
                return 1;
        }
        return 0;
@@ -227,6 +229,54 @@ trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr)
 }
 #endif /* CONFIG_FUNCTION_TRACER */
 
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+/*
+ * Pretty much the same than for the function tracer from which the selftest
+ * has been borrowed.
+ */
+int
+trace_selftest_startup_function_graph(struct tracer *trace,
+                                       struct trace_array *tr)
+{
+       int ret;
+       unsigned long count;
+
+       ret = tracer_init(trace, tr);
+       if (ret) {
+               warn_failed_init_tracer(trace, ret);
+               goto out;
+       }
+
+       /* Sleep for a 1/10 of a second */
+       msleep(100);
+
+       tracing_stop();
+
+       /* check the trace buffer */
+       ret = trace_test_buffer(tr, &count);
+
+       trace->reset(tr);
+       tracing_start();
+
+       if (!ret && !count) {
+               printk(KERN_CONT ".. no entries found ..");
+               ret = -1;
+               goto out;
+       }
+
+       /* Don't test dynamic tracing, the function tracer already did */
+
+out:
+       /* Stop it if we failed */
+       if (ret)
+               ftrace_graph_stop();
+
+       return ret;
+}
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
+
 #ifdef CONFIG_IRQSOFF_TRACER
 int
 trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)