arm64: kernel: pause/unpause function graph tracer in cpu_suspend()
authorLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tue, 17 Nov 2015 11:50:51 +0000 (11:50 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 17 Nov 2015 17:11:45 +0000 (17:11 +0000)
commitde818bd4522c40ea02a81b387d2fa86f989c9623
treea52307d97ef63e2ba241531f4c7d5ab030243fb6
parentadc235aff6fcf5ae4d8dc00faf30a07632b9725b
arm64: kernel: pause/unpause function graph tracer in cpu_suspend()

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: 819e50e25d0c ("arm64: Add ftrace support")
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reported-by: Catalin Marinas <catalin.marinas@arm.com>
Reported-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: <stable@vger.kernel.org> # 3.16+
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/suspend.c