[PATCH] arm64: smp call when task currently running on other cpu

From: Wang Qing
Date: Fri Jun 12 2020 - 03:41:58 EST


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 <wangqing@xxxxxxxx>
---
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