diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-05-12 21:20:47 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2008-05-23 23:39:00 +0200 | 
| commit | f06c38103ea9dbca27c3f4d77f444ddefb5477cd (patch) | |
| tree | 9452cf51a1acb2a2019d1680668d051370b08981 /kernel/trace/trace_sysprof.c | |
| parent | 677aa9f77e8de3791b481a0cec6c8b84d1eec626 (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.c | 80 | 
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 @@ +/* + * trace stack traces + * + * Copyright (C) 2007 Steven Rostedt <srostedt@redhat.com> + * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com> + * + */ +#include <linux/module.h> +#include <linux/fs.h> +#include <linux/debugfs.h> +#include <linux/kallsyms.h> +#include <linux/uaccess.h> +#include <linux/marker.h> +#include <linux/ftrace.h> + +#include "trace.h" + +static struct trace_array	*ctx_trace; +static int __read_mostly	tracer_enabled; + +static notrace void stack_reset(struct trace_array *tr) +{ +	int cpu; + +	tr->time_start = ftrace_now(tr->cpu); + +	for_each_online_cpu(cpu) +		tracing_reset(tr->data[cpu]); +} + +static notrace void start_stack_trace(struct trace_array *tr) +{ +	stack_reset(tr); +	tracer_enabled = 1; +} + +static notrace void stop_stack_trace(struct trace_array *tr) +{ +	tracer_enabled = 0; +} + +static notrace void stack_trace_init(struct trace_array *tr) +{ +	ctx_trace = tr; + +	if (tr->ctrl) +		start_stack_trace(tr); +} + +static notrace void stack_trace_reset(struct trace_array *tr) +{ +	if (tr->ctrl) +		stop_stack_trace(tr); +} + +static void stack_trace_ctrl_update(struct trace_array *tr) +{ +	/* When starting a new trace, reset the buffers */ +	if (tr->ctrl) +		start_stack_trace(tr); +	else +		stop_stack_trace(tr); +} + +static struct tracer stack_trace __read_mostly = +{ +	.name		= "sysprof", +	.init		= stack_trace_init, +	.reset		= stack_trace_reset, +	.ctrl_update	= stack_trace_ctrl_update, +#ifdef CONFIG_FTRACE_SELFTEST +	.selftest    = trace_selftest_startup_stack, +#endif +}; + +__init static int init_stack_trace(void) +{ +	return register_tracer(&stack_trace); +} +device_initcall(init_stack_trace); | 
