aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_sysprof.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-05-12 15:20:47 -0400
committerThomas Gleixner <tglx@linutronix.de>2008-05-23 17:39:00 -0400
commitf06c38103ea9dbca27c3f4d77f444ddefb5477cd (patch)
tree9452cf51a1acb2a2019d1680668d051370b08981 /kernel/trace/trace_sysprof.c
parent677aa9f77e8de3791b481a0cec6c8b84d1eec626 (diff)
ftrace: add sysprof plugin
very first baby version. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/trace/trace_sysprof.c')
-rw-r--r--kernel/trace/trace_sysprof.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/kernel/trace/trace_sysprof.c b/kernel/trace/trace_sysprof.c
new file mode 100644
index 000000000000..6c139bc1be7e
--- /dev/null
+++ b/kernel/trace/trace_sysprof.c
@@ -0,0 +1,80 @@
1/*
2 * trace stack traces
3 *
4 * Copyright (C) 2007 Steven Rostedt <srostedt@redhat.com>
5 * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com>
6 *
7 */
8#include <linux/module.h>
9#include <linux/fs.h>
10#include <linux/debugfs.h>
11#include <linux/kallsyms.h>
12#include <linux/uaccess.h>
13#include <linux/marker.h>
14#include <linux/ftrace.h>
15
16#include "trace.h"
17
18static struct trace_array *ctx_trace;
19static int __read_mostly tracer_enabled;
20
21static notrace void stack_reset(struct trace_array *tr)
22{
23 int cpu;
24
25 tr->time_start = ftrace_now(tr->cpu);
26
27 for_each_online_cpu(cpu)
28 tracing_reset(tr->data[cpu]);
29}
30
31static notrace void start_stack_trace(struct trace_array *tr)
32{
33 stack_reset(tr);
34 tracer_enabled = 1;
35}
36
37static notrace void stop_stack_trace(struct trace_array *tr)
38{
39 tracer_enabled = 0;
40}
41
42static notrace void stack_trace_init(struct trace_array *tr)
43{
44 ctx_trace = tr;
45
46 if (tr->ctrl)
47 start_stack_trace(tr);
48}
49
50static notrace void stack_trace_reset(struct trace_array *tr)
51{
52 if (tr->ctrl)
53 stop_stack_trace(tr);
54}
55
56static void stack_trace_ctrl_update(struct trace_array *tr)
57{
58 /* When starting a new trace, reset the buffers */
59 if (tr->ctrl)
60 start_stack_trace(tr);
61 else
62 stop_stack_trace(tr);
63}
64
65static struct tracer stack_trace __read_mostly =
66{
67 .name = "sysprof",
68 .init = stack_trace_init,
69 .reset = stack_trace_reset,
70 .ctrl_update = stack_trace_ctrl_update,
71#ifdef CONFIG_FTRACE_SELFTEST
72 .selftest = trace_selftest_startup_stack,
73#endif
74};
75
76__init static int init_stack_trace(void)
77{
78 return register_tracer(&stack_trace);
79}
80device_initcall(init_stack_trace);