We cannot get FP and PC when the task is running on another CPU,
task->thread.cpu_context is the last time the task was switched out,
we can use smp call to print backtrace itself.

Signed-off-by: Wang Qing <[email protected]>
---
 arch/arm64/kernel/traps.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
 mode change 100644 => 100755 arch/arm64/kernel/traps.c

diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index 50cc30a..17a07b9
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -83,6 +83,11 @@ static void dump_kernel_instr(const char *lvl, struct 
pt_regs *regs)
        printk("%sCode: %s\n", lvl, str);
 }
 
+static void dump_backtrace_smp_fun(struct task_struct *tsk)
+{
+       dump_backtrace(NULL, tsk, KERN_DEFAULT);
+}
+
 void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,
                    const char *loglvl)
 {
@@ -107,6 +112,12 @@ void dump_backtrace(struct pt_regs *regs, struct 
task_struct *tsk,
                start_backtrace(&frame,
                                (unsigned long)__builtin_frame_address(0),
                                (unsigned long)dump_backtrace);
+       } else if (task_curr(tsk)) {
+               /*
+                * The task is currently running on other cpu
+                */
+               smp_call_function_single(tsk->cpu, dump_backtrace_fun, tsk, 0);
+               return;
        } else {
                /*
                 * task blocked in __switch_to
-- 
2.7.4

Reply via email to