• Lorenzo Pieralisi's avatar
    arm64: kernel: pause/unpause function graph tracer in cpu_suspend() · de818bd4
    Lorenzo Pieralisi authored
    The function graph tracer adds instrumentation that is required to trace
    both entry and exit of a function. In particular the function graph
    tracer updates the "return address" of a function in order to insert
    a trace callback on function exit.
    
    Kernel power management functions like cpu_suspend() are called
    upon power down entry with functions called "finishers" that are in turn
    called to trigger the power down sequence but they may not return to the
    kernel through the normal return path.
    
    When the core resumes from low-power it returns to the cpu_suspend()
    function through the cpu_resume path, which leaves the trace stack frame
    set-up by the function tracer in an incosistent state upon return to the
    kernel when tracing is enabled.
    
    This patch fixes the issue by pausing/resuming the function graph
    tracer on the thread executing cpu_suspend() (ie the function call that
    subsequently triggers the "suspend finishers"), so that the function graph
    tracer state is kept consistent across functions that enter power down
    states and never return by effectively disabling graph tracer while they
    are executing.
    
    Fixes: 819e50e2 ("arm64: Add ftrace support")
    Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Reported-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Reported-by: default avatarAKASHI Takahiro <takahiro.akashi@linaro.org>
    Suggested-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: <stable@vger.kernel.org> # 3.16+
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    de818bd4
suspend.c 4.41 KB