• Steven Rostedt's avatar
    tracing/sched: Make preempt_schedule() notrace · d1f74e20
    Steven Rostedt authored
    The function tracer code uses ftrace_preempt_disable() to disable
    preemption instead of normal preempt_disable(). But there's a slight
    race condition that may cause it to lose a preemption check.
    
    This was made to keep the function tracer from recursing on itself
    by disabling preemption then having the enable call the function tracer
    again, causing infinite recursion.
    
    The bug was assumed to happen if the call was just in schedule, but
    this is incorrect. The bug is caused by preempt_schedule() which
    is called by preempt_enable(). The calling of preempt_enable() when
    NEED_RESCHED was set would call preempt_schedule() which would call
    the function tracer again.
    
    By making the preempt_schedule() and add_preempt_count() notrace
    then this will prevent the inifinite recursion. This is because
    the add_preempt_count() would stop the preempt_enable() in the
    function tracer from calling preempt_schedule() again.
    
    The sub_preempt_count() is also made notrace just to keep it
    symmetric.
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    d1f74e20
sched.c 213 KB