| /* |
| * ring buffer based function tracer |
| * |
| * Copyright (C) 2007-2008 Steven Rostedt <srostedt@redhat.com> |
| * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com> |
| * |
| * Based on code from the latency_tracer, that is: |
| * |
| * Copyright (C) 2004-2006 Ingo Molnar |
| * Copyright (C) 2004 William Lee Irwin III |
| */ |
| #include <linux/debugfs.h> |
| #include <linux/uaccess.h> |
| #include <linux/ftrace.h> |
| #include <linux/fs.h> |
| |
| #include "trace.h" |
| |
| static void function_reset(struct trace_array *tr) |
| { |
| int cpu; |
| |
| tr->time_start = ftrace_now(tr->cpu); |
| |
| for_each_online_cpu(cpu) |
| tracing_reset(tr, cpu); |
| } |
| |
| static void start_function_trace(struct trace_array *tr) |
| { |
| tr->cpu = get_cpu(); |
| function_reset(tr); |
| put_cpu(); |
| |
| tracing_start_cmdline_record(); |
| tracing_start_function_trace(); |
| } |
| |
| static void stop_function_trace(struct trace_array *tr) |
| { |
| tracing_stop_function_trace(); |
| tracing_stop_cmdline_record(); |
| } |
| |
| static void function_trace_init(struct trace_array *tr) |
| { |
| if (tr->ctrl) |
| start_function_trace(tr); |
| } |
| |
| static void function_trace_reset(struct trace_array *tr) |
| { |
| if (tr->ctrl) |
| stop_function_trace(tr); |
| } |
| |
| static void function_trace_ctrl_update(struct trace_array *tr) |
| { |
| if (tr->ctrl) |
| start_function_trace(tr); |
| else |
| stop_function_trace(tr); |
| } |
| |
| static struct tracer function_trace __read_mostly = |
| { |
| .name = "function", |
| .init = function_trace_init, |
| .reset = function_trace_reset, |
| .ctrl_update = function_trace_ctrl_update, |
| #ifdef CONFIG_FTRACE_SELFTEST |
| .selftest = trace_selftest_startup_function, |
| #endif |
| }; |
| |
| static __init int init_function_trace(void) |
| { |
| return register_tracer(&function_trace); |
| } |
| |
| device_initcall(init_function_trace); |