• Steven Rostedt (VMware)'s avatar
    ftrace: Add use of synchronize_rcu_tasks() with dynamic trampolines · 0598e4f0
    Steven Rostedt (VMware) authored
    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: default avatar"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    0598e4f0
ftrace.c 146 KB