1
linux/kernel/trace
Steven Rostedt 6331c28c96 ftrace: Fix dynamic selftest failure on some archs
Archs that do not implement CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST, will
fail the dynamic ftrace selftest.

The function tracer has a quick 'off' variable that will prevent
the call back functions from being called. This variable is called
function_trace_stop. In x86, this is implemented directly in the mcount
assembly, but for other archs, an intermediate function is used called
ftrace_test_stop_func().

In dynamic ftrace, the function pointer variable ftrace_trace_function is
used to update the caller code in the mcount caller. But for archs that
do not have CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST set, it only calls
ftrace_test_stop_func() instead, which in turn calls __ftrace_trace_function.

When more than one ftrace_ops is registered, the function it calls is
ftrace_ops_list_func(), which will iterate over all registered ftrace_ops
and call the callbacks that have their hash matching.

The issue happens when two ftrace_ops are registered for different functions
and one is then unregistered. The __ftrace_trace_function is then pointed
to the remaining ftrace_ops callback function directly. This mean it will
be called for all functions that were registered to trace by both ftrace_ops
that were registered.

This is not an issue for archs with CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST,
because the update of ftrace_trace_function doesn't happen until after all
functions have been updated, and then the mcount caller is updated. But
for those archs that do use the ftrace_test_stop_func(), the update is
immediate.

The dynamic selftest fails because it hits this situation, and the
ftrace_ops that it registers fails to only trace what it was suppose to
and instead traces all other functions.

The solution is to delay the setting of __ftrace_trace_function until
after all the functions have been updated according to the registered
ftrace_ops. Also, function_trace_stop is set during the update to prevent
function tracing from calling code that is caused by the function tracer
itself.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2011-07-13 22:25:09 -04:00
..
blktrace.c block: make unplug timer trace event correspond to the schedule() unplug 2011-04-16 13:51:05 +02:00
ftrace.c ftrace: Fix dynamic selftest failure on some archs 2011-07-13 22:25:09 -04:00
Kconfig ftrace: Build without frame pointers on Microblaze 2011-04-21 09:06:24 -04:00
Makefile tracing: Fix TRACE_EVENT power tracepoint creation 2011-01-07 23:26:29 -05:00
power-traces.c perf: Clean up power events by introducing new, more generic ones 2011-01-04 08:16:54 +01:00
ring_buffer_benchmark.c tracing: Use NUMA allocation for per-cpu ring buffer pages 2011-06-14 22:04:39 -04:00
ring_buffer.c ring-buffer: Set __GFP_NORETRY flag for ring buffer allocating process 2011-06-14 22:48:51 -04:00
trace_branch.c
trace_clock.c Fix common misspellings 2011-03-31 11:26:23 -03:00
trace_entries.h Fix common misspellings 2011-03-31 11:26:23 -03:00
trace_event_perf.c tracing: New flag to allow non privileged users to use a trace event 2010-11-18 14:37:40 +01:00
trace_events_filter.c trace, filters: Initialize the match variable in process_ops() properly 2011-03-18 14:41:27 +01:00
trace_events.c tracing: Convert to kstrtoul_from_user 2011-06-14 22:48:50 -04:00
trace_export.c tracing: Replace trace_event struct array with pointer array 2011-02-02 21:37:13 -05:00
trace_functions_graph.c tracing: Still trace filtered irq functions when irq trace is disabled 2011-07-07 22:26:27 -04:00
trace_functions.c ftrace: Implement separate user function filtering 2011-05-18 15:29:50 -04:00
trace_irqsoff.c tracing, function_graph: Remove dependency of abstime and duration fields on latency 2011-06-14 22:48:47 -04:00
trace_kdb.c
trace_kprobe.c Merge branch 'tip/perf/core-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into perf/core 2011-07-05 11:55:43 +02:00
trace_mmiotrace.c
trace_nop.c
trace_output.c tracing: Add __print_symbolic_u64 to avoid warnings on 32bit machine 2011-05-25 22:13:44 -04:00
trace_output.h
trace_printk.c tracing: Fix regression in printk_formats file 2011-06-09 08:42:15 -04:00
trace_sched_switch.c tracing: Remove obsolete sched_switch tracer 2011-02-08 17:14:56 -05:00
trace_sched_wakeup.c tracing, function_graph: Remove dependency of abstime and duration fields on latency 2011-06-14 22:48:47 -04:00
trace_selftest_dynamic.c ftrace: Add self-tests for multiple function trace users 2011-05-18 19:24:51 -04:00
trace_selftest.c ftrace: Add self-tests for multiple function trace users 2011-05-18 19:24:51 -04:00
trace_stack.c tracing: Convert to kstrtoul_from_user 2011-06-14 22:48:50 -04:00
trace_stat.c
trace_stat.h
trace_syscalls.c tracing/syscalls: Early terminate search for sys_ni_syscall 2011-02-07 21:30:14 -05:00
trace_workqueue.c
trace.c tracing/kprobes: Fix kprobe-tracer to support stack trace 2011-06-14 22:48:53 -04:00
trace.h tracing: Still trace filtered irq functions when irq trace is disabled 2011-07-07 22:26:27 -04:00