aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--kernel/trace/Kconfig8
-rw-r--r--kernel/trace/Makefile1
-rw-r--r--kernel/trace/trace_sysprof.c80
3 files changed, 89 insertions, 0 deletions
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index 5c2295b29f2c..e101c9a85f0f 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -75,6 +75,14 @@ config PREEMPT_TRACER
75 enabled. This option and the irqs-off timing option can be 75 enabled. This option and the irqs-off timing option can be
76 used together or separately.) 76 used together or separately.)
77 77
78config SYSPROF_TRACER
79 bool "Sysprof Tracer"
80 depends on DEBUG_KERNEL
81 select TRACING
82 help
83 This tracer provides the trace needed by the 'Sysprof' userspace
84 tool.
85
78config SCHED_TRACER 86config SCHED_TRACER
79 bool "Scheduling Latency Tracer" 87 bool "Scheduling Latency Tracer"
80 depends on HAVE_FTRACE 88 depends on HAVE_FTRACE
diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile
index d9efbbfa2bdf..7aec123ec1d8 100644
--- a/kernel/trace/Makefile
+++ b/kernel/trace/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_FTRACE) += libftrace.o
14 14
15obj-$(CONFIG_TRACING) += trace.o 15obj-$(CONFIG_TRACING) += trace.o
16obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o 16obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o
17obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o
17obj-$(CONFIG_FTRACE) += trace_functions.o 18obj-$(CONFIG_FTRACE) += trace_functions.o
18obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o 19obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o
19obj-$(CONFIG_PREEMPT_TRACER) += trace_irqsoff.o 20obj-$(CONFIG_PREEMPT_TRACER) += trace_irqsoff.o
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);