ftrace: Add use of synchronize_rcu_tasks() with dynamic trampolines
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Thu, 6 Apr 2017 14:28:12 +0000 (10:28 -0400)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 7 Apr 2017 13:41:51 +0000 (09:41 -0400)
commit0598e4f08e3da1fea2ee3b4765a44798147a8c62
tree7d6875f6d550e9571b88e8f0302cb9b895f74880
parent696ced4fb1d76802f864d8848aa4716633f83c17
ftrace: Add use of synchronize_rcu_tasks() with dynamic trampolines

The function tracer needs to be more careful than other subsystems when it
comes to freeing data. Especially if that data is actually executable code.
When a single function is traced, a trampoline can be dynamically allocated
which is called to jump to the function trace callback. When the callback is
no longer needed, the dynamic allocated trampoline needs to be freed. This
is where the issues arise. The dynamically allocated trampoline must not be
used again. As function tracing can trace all subsystems, including
subsystems that are used to serialize aspects of freeing (namely RCU), it
must take extra care when doing the freeing.

Before synchronize_rcu_tasks() was around, there was no way for the function
tracer to know that nothing was using the dynamically allocated trampoline
when CONFIG_PREEMPT was enabled. That's because a task could be indefinitely
preempted while sitting on the trampoline. Now with synchronize_rcu_tasks(),
it will wait till all tasks have either voluntarily scheduled (not on the
trampoline) or goes into userspace (not on the trampoline). Then it is safe
to free the trampoline even with CONFIG_PREEMPT set.

Acked-by: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
kernel/trace/Kconfig
kernel/trace/ftrace.c