diff options
Diffstat (limited to 'arch/x86/kernel/dumpstack_32.c')
-rw-r--r-- | arch/x86/kernel/dumpstack_32.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index 50076d4366c4..2d65cfa5e0b4 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
@@ -89,16 +89,32 @@ int get_stack_info(unsigned long *stack, struct task_struct *task, | |||
89 | task = task ? : current; | 89 | task = task ? : current; |
90 | 90 | ||
91 | if (in_task_stack(stack, task, info)) | 91 | if (in_task_stack(stack, task, info)) |
92 | return 0; | 92 | goto recursion_check; |
93 | 93 | ||
94 | if (task != current) | 94 | if (task != current) |
95 | goto unknown; | 95 | goto unknown; |
96 | 96 | ||
97 | if (in_hardirq_stack(stack, info)) | 97 | if (in_hardirq_stack(stack, info)) |
98 | return 0; | 98 | goto recursion_check; |
99 | 99 | ||
100 | if (in_softirq_stack(stack, info)) | 100 | if (in_softirq_stack(stack, info)) |
101 | return 0; | 101 | goto recursion_check; |
102 | |||
103 | goto unknown; | ||
104 | |||
105 | recursion_check: | ||
106 | /* | ||
107 | * Make sure we don't iterate through any given stack more than once. | ||
108 | * If it comes up a second time then there's something wrong going on: | ||
109 | * just break out and report an unknown stack type. | ||
110 | */ | ||
111 | if (visit_mask) { | ||
112 | if (*visit_mask & (1UL << info->type)) | ||
113 | goto unknown; | ||
114 | *visit_mask |= 1UL << info->type; | ||
115 | } | ||
116 | |||
117 | return 0; | ||
102 | 118 | ||
103 | unknown: | 119 | unknown: |
104 | info->type = STACK_TYPE_UNKNOWN; | 120 | info->type = STACK_TYPE_UNKNOWN; |