[PATCH 1/1] arm: add try_get_task_stack() for __get_wchan

Maninder Singh maninder1.s at samsung.com
Thu Mar 5 20:14:32 PST 2026


As per help menu of "THREAD_INFO_IN_TASK", try_get_task_stack()
is needed for get_wchan.
For ARM it was missed while enabling THREAD_INFO_IN_TASK.
Adding try_get_task_stack() for ARM as well.

Fixes: 18ed1c01a7dd ("ARM: smp: Enable THREAD_INFO_IN_TASK")
Signed-off-by: Maninder Singh <maninder1.s at samsung.com>
---
 arch/arm/kernel/process.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index d7aa95225c70..1a84ceb9f7d0 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -280,23 +280,31 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 unsigned long __get_wchan(struct task_struct *p)
 {
 	struct stackframe frame;
-	unsigned long stack_page;
+	unsigned long stack_page, ret = 0;
 	int count = 0;
 
+	stack_page = (unsigned long)try_get_task_stack(p);
+	if (!stack_page)
+		return 0;
+
 	frame.fp = thread_saved_fp(p);
 	frame.sp = thread_saved_sp(p);
 	frame.lr = 0;			/* recovered from the stack */
 	frame.pc = thread_saved_pc(p);
-	stack_page = (unsigned long)task_stack_page(p);
 	do {
 		if (frame.sp < stack_page ||
 		    frame.sp >= stack_page + THREAD_SIZE ||
 		    unwind_frame(&frame) < 0)
-			return 0;
-		if (!in_sched_functions(frame.pc))
-			return frame.pc;
+			goto out;
+		if (!in_sched_functions(frame.pc)) {
+			ret = frame.pc;
+			goto out;
+		}
 	} while (count ++ < 16);
-	return 0;
+
+out:
+	put_task_stack(p);
+	return ret;
 }
 
 #ifdef CONFIG_MMU
-- 
2.34.1




More information about the linux-arm-kernel mailing list