ftrace: add tracer called branch
authorSteven Rostedt <srostedt@redhat.com>
Wed, 12 Nov 2008 20:24:24 +0000 (15:24 -0500)
committerIngo Molnar <mingo@elte.hu>
Wed, 12 Nov 2008 21:28:25 +0000 (22:28 +0100)
Impact: added new branch tracer

Currently the tracing of branch profiling (unlikelys and likelys hit)
is only activated by the iter_ctrl. This patch adds a tracer called
"branch" that will just trace the branch profiling. The advantage
of adding this tracer is that it can be added to the ftrace selftests
on startup.

Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/trace/trace.h
kernel/trace/trace_selftest.c
kernel/trace/trace_unlikely.c

index 7fbf37b27453c393053170dbec9d222ee9e67f57..9e015f5bea1dabdec178c8b9998f8a59c9a72850 100644 (file)
@@ -420,6 +420,8 @@ extern int trace_selftest_startup_sched_switch(struct tracer *trace,
                                               struct trace_array *tr);
 extern int trace_selftest_startup_sysprof(struct tracer *trace,
                                               struct trace_array *tr);
+extern int trace_selftest_startup_branch(struct tracer *trace,
+                                        struct trace_array *tr);
 #endif /* CONFIG_FTRACE_STARTUP_TEST */
 
 extern void *head_page(struct trace_array_cpu *data);
index 0728a105dcc16f41cb8293913e2e5286f1c4be56..24e6e075e6d65c517303390bba7314de39918ca2 100644 (file)
@@ -13,6 +13,7 @@ static inline int trace_valid_entry(struct trace_entry *entry)
        case TRACE_STACK:
        case TRACE_PRINT:
        case TRACE_SPECIAL:
+       case TRACE_BRANCH:
                return 1;
        }
        return 0;
@@ -544,3 +545,25 @@ trace_selftest_startup_sysprof(struct tracer *trace, struct trace_array *tr)
        return ret;
 }
 #endif /* CONFIG_SYSPROF_TRACER */
+
+#ifdef CONFIG_BRANCH_TRACER
+int
+trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)
+{
+       unsigned long count;
+       int ret;
+
+       /* start the tracing */
+       trace->init(tr);
+       /* Sleep for a 1/10 of a second */
+       msleep(100);
+       /* stop the tracing. */
+       tracing_stop();
+       /* check the trace buffer */
+       ret = trace_test_buffer(tr, &count);
+       trace->reset(tr);
+       tracing_start();
+
+       return ret;
+}
+#endif /* CONFIG_BRANCH_TRACER */
index e5d5969853a3dc30960d2461e97d58c26dd11976..85265553918f266698e7136e2ca828e9ca33ce10 100644 (file)
@@ -114,6 +114,48 @@ void disable_branch_tracing(void)
  out_unlock:
        mutex_unlock(&branch_tracing_mutex);
 }
+
+static void start_branch_trace(struct trace_array *tr)
+{
+       enable_branch_tracing(tr);
+}
+
+static void stop_branch_trace(struct trace_array *tr)
+{
+       disable_branch_tracing();
+}
+
+static void branch_trace_init(struct trace_array *tr)
+{
+       int cpu;
+
+       for_each_online_cpu(cpu)
+               tracing_reset(tr, cpu);
+
+       start_branch_trace(tr);
+}
+
+static void branch_trace_reset(struct trace_array *tr)
+{
+       stop_branch_trace(tr);
+}
+
+struct tracer branch_trace __read_mostly =
+{
+       .name           = "branch",
+       .init           = branch_trace_init,
+       .reset          = branch_trace_reset,
+#ifdef CONFIG_FTRACE_SELFTEST
+       .selftest       = trace_selftest_startup_branch,
+#endif
+};
+
+__init static int init_branch_trace(void)
+{
+       return register_tracer(&branch_trace);
+}
+
+device_initcall(init_branch_trace);
 #else
 static inline
 void trace_likely_condition(struct ftrace_branch_data *f, int val, int expect)