diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 96330dd927109882283d1d57c55af861cf69c0cc..da0fe9ea259c7216801d4044ce96410bf4d84c09 100755 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -794,6 +794,9 @@ unsigned long get_wchan(struct task_struct *p) if (!p || p == current || p->state == TASK_RUNNING) return 0; + if (!try_get_task_stack(p)) + return 0; + for (unwind_start(&state, p, NULL, NULL); !unwind_done(&state); unwind_next_frame(&state)) { addr = unwind_get_return_address(&state); @@ -804,6 +807,8 @@ unsigned long get_wchan(struct task_struct *p) break; } + put_task_stack(p); + return addr; }