aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/dumpstack_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/dumpstack_32.c')
-rw-r--r--arch/x86/kernel/dumpstack_32.c22
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
105recursion_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
103unknown: 119unknown:
104 info->type = STACK_TYPE_UNKNOWN; 120 info->type = STACK_TYPE_UNKNOWN;