Steven Rostedt (Red Hat)
6224beb12e
tracing: Have branch tracer use recursive field of task struct
...
Fengguang Wu's tests triggered a bug in the branch tracer's start up
test when CONFIG_DEBUG_PREEMPT set. This was because that config
adds some debug logic in the per cpu field, which calls back into
the branch tracer.
The branch tracer has its own recursive checks, but uses a per cpu
variable to implement it. If retrieving the per cpu variable calls
back into the branch tracer, you can see how things will break.
Instead of using a per cpu variable, use the trace_recursion field
of the current task struct. Simply set a bit when entering the
branch tracing and clear it when leaving. If the bit is set on
entry, just don't do the tracing.
There's also the case with lockdep, as the local_irq_save() called
before the recursion can also trigger code that can call back into
the function. Changing that to a raw_local_irq_save() will protect
that as well.
This prevents the recursion and the inevitable crash that follows.
Link: http://lkml.kernel.org/r/20150630141803.GA28071@wfg-t540p.sh.intel.com
Cc: stable@vger.kernel.org # 3.10+
Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Tested-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2015-07-08 11:53:45 -04:00
..
blktrace.c
This patch series contains several clean ups and even a new trace clock
2015-06-26 14:02:43 -07:00
bpf_trace.c
bpf: let kprobe programs use bpf_get_smp_processor_id() helper
2015-06-15 15:53:50 -07:00
ftrace.c
Some clean ups and small fixes, but the biggest change is the addition
2015-04-14 10:49:03 -07:00
Kconfig
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-04-14 14:37:47 -07:00
Makefile
bpf: Fix the build on BPF_SYSCALL=y && !CONFIG_TRACING kernels, make it more configurable
2015-04-02 16:28:06 +02:00
power-traces.c
PM / sleep: export suspend_resume trace event
2015-01-30 02:10:41 +01:00
ring_buffer.c
ring-buffer: Add enum names for the context levels
2015-05-29 10:39:08 -04:00
ring_buffer_benchmark.c
This patch series contains several clean ups and even a new trace clock
2015-06-26 14:02:43 -07:00
rpm-traces.c
trace.c
tracing: Rename FTRACE_EVENT_FL_* flags to EVENT_FILE_FL_*
2015-05-13 15:24:57 -04:00
trace.h
tracing: Have branch tracer use recursive field of task struct
2015-07-08 11:53:45 -04:00
trace_benchmark.c
trace_benchmark.h
trace_branch.c
tracing: Have branch tracer use recursive field of task struct
2015-07-08 11:53:45 -04:00
trace_clock.c
tracing: Export tracing clock functions
2015-05-12 15:56:57 -04:00
trace_entries.h
tracing: %pF is only for function pointers
2015-03-25 08:57:22 -04:00
trace_event_perf.c
tracing: Rename ftrace_event_{call,class} to trace_event_{call,class}
2015-05-13 14:06:10 -04:00
trace_events.c
tracing: Rename FTRACE_EVENT_FL_* flags to EVENT_FILE_FL_*
2015-05-13 15:24:57 -04:00
trace_events_filter.c
This patch series contains several clean ups and even a new trace clock
2015-06-26 14:02:43 -07:00
trace_events_filter_test.h
trace_events_trigger.c
tracing: Rename ftrace_raw_##call event structures to trace_event_raw_##call
2015-05-13 21:48:40 -04:00
trace_export.c
tracing: Rename ftrace_event_{call,class} to trace_event_{call,class}
2015-05-13 14:06:10 -04:00
trace_functions.c
tracing/trivial: Fix typos and make an int into a bool
2014-11-20 10:05:36 -05:00
trace_functions_graph.c
tracing: Rename ftrace_event_{call,class} to trace_event_{call,class}
2015-05-13 14:06:10 -04:00
trace_irqsoff.c
tracing: Remove unneeded includes of debugfs.h and fs.h
2015-01-22 11:19:48 -05:00
trace_kdb.c
KGDB/KDB fixes and cleanups
2015-01-09 20:51:10 -08:00
trace_kprobe.c
tracing: Rename ftrace_trigger_soft_disabled() to trace_trigger_soft_disabled()
2015-05-13 15:25:39 -04:00
trace_mmiotrace.c
tracing: Rename ftrace_event_{call,class} to trace_event_{call,class}
2015-05-13 14:06:10 -04:00
trace_nop.c
tracing: Remove unneeded includes of debugfs.h and fs.h
2015-01-22 11:19:48 -05:00
trace_output.c
tracing: Rename ftrace_event_name() to trace_event_name()
2015-05-13 14:20:14 -04:00
trace_output.h
tracing: Rename (un)register_ftrace_event() to (un)register_trace_event()
2015-05-13 14:05:14 -04:00
trace_printk.c
tracing: Use IS_ERR() check for return value of tracing_init_dentry()
2015-01-22 11:19:49 -05:00
trace_probe.c
trace: Don't use __weak in header files
2015-03-25 08:57:23 -04:00
trace_probe.h
tracing: Rename ftrace_event_{call,class} to trace_event_{call,class}
2015-05-13 14:06:10 -04:00
trace_sched_switch.c
tracing: Remove unneeded includes of debugfs.h and fs.h
2015-01-22 11:19:48 -05:00
trace_sched_wakeup.c
tracing: Rename ftrace_event_{call,class} to trace_event_{call,class}
2015-05-13 14:06:10 -04:00
trace_selftest.c
trace_selftest_dynamic.c
trace_seq.c
tracing: use %*pb[l] to print bitmaps including cpumasks and nodemasks
2015-02-13 21:21:37 -08:00
trace_stack.c
tracing: remove use of seq_printf return value
2015-04-15 16:35:25 -07:00
trace_stat.c
tracing: Convert the tracing facility over to use tracefs
2015-02-03 12:48:41 -05:00
trace_stat.h
trace_syscalls.c
tracing: Rename ftrace_trigger_soft_disabled() to trace_trigger_soft_disabled()
2015-05-13 15:25:39 -04:00
trace_uprobe.c
tracing: Rename ftrace_trigger_soft_disabled() to trace_trigger_soft_disabled()
2015-05-13 15:25:39 -04:00