diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 7e41ac5033adc4ecbaf7dd3aba22e53e93d0275f..ca588a3ac01bcbf8a44c5c3eae0de0914d473ea0 100755 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -925,6 +925,9 @@ unsigned long get_wchan(struct task_struct *p) if (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); @@ -934,6 +937,8 @@ unsigned long get_wchan(struct task_struct *p) continue; break; } + + put_task_stack(p); return addr; }