/* * ring buffer based function tracer * * Copyright (C) 2007-2008 Steven Rostedt * Copyright (C) 2008 Ingo Molnar * * Based on code from the latency_tracer, that is: * * Copyright (C) 2004-2006 Ingo Molnar * Copyright (C) 2004 William Lee Irwin III */ #include #include #include #include #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 = "ftrace", .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);