Commit 7816fecd authored by Matt Fleming's avatar Matt Fleming Committed by Paul Mundt

sh: Mark __switch_to() as __notrace_funcgraph

Annotate __switch_to() so that the function graph tracer does not try to
trace it. Use __notrace_funcgraph, as opposed to notrace, so that other
tracers can continue to trace __switch_to().

The reason that we don't want to trace __switch_to() with the function
graph tracer is because of how the return address stack in task_struct
is implemented. When we enter __switch_to we store the real return
address on prev's ret_stack. When we return from __switch_to() we've
patched the return address on the kernel stack to be
return_to_handler. Calling return_to_handler we do,

       -> ftrace_return_to_handler()
       	  -> ftrace_pop_return_ftrace()

Which tries to pop the real return address from current->ret_stack. The
problem being that we stored the return address on prev->ret_stack, but
current now points to next, and next->ret_stack doesn't contain the
correct return address (and is possibly even empty).
Signed-off-by: default avatarMatt Fleming <matt@console-pimps.org>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 327933f5
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/tick.h> #include <linux/tick.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/ftrace.h>
#include <linux/preempt.h> #include <linux/preempt.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
...@@ -264,8 +265,8 @@ static void ubc_set_tracing(int asid, unsigned long pc) ...@@ -264,8 +265,8 @@ static void ubc_set_tracing(int asid, unsigned long pc)
* switch_to(x,y) should switch tasks from x to y. * switch_to(x,y) should switch tasks from x to y.
* *
*/ */
struct task_struct *__switch_to(struct task_struct *prev, __notrace_funcgraph struct task_struct *
struct task_struct *next) __switch_to(struct task_struct *prev, struct task_struct *next)
{ {
#if defined(CONFIG_SH_FPU) #if defined(CONFIG_SH_FPU)
unlazy_fpu(prev, task_pt_regs(prev)); unlazy_fpu(prev, task_pt_regs(prev));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment