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;
 }