Print a warning if stack recursion is detected.

Use printk_deferred_once() because the unwinder can be called with the
console lock by lockdep via save_stack_trace().

Signed-off-by: Josh Poimboeuf <jpoim...@redhat.com>
---
 arch/x86/kernel/dumpstack_32.c | 5 ++++-
 arch/x86/kernel/dumpstack_64.c | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c
index 90cf460..99ac8d2 100644
--- a/arch/x86/kernel/dumpstack_32.c
+++ b/arch/x86/kernel/dumpstack_32.c
@@ -109,8 +109,11 @@ int get_stack_info(unsigned long *stack, struct 
task_struct *task,
         * just break out and report an unknown stack type.
         */
        if (visit_mask) {
-               if (*visit_mask & (1UL << info->type))
+               if (*visit_mask & (1UL << info->type)) {
+                       printk_deferred_once(KERN_WARNING "WARNING: stack 
recursion on stack type %d\n",
+                                            info->type);
                        goto unknown;
+               }
                *visit_mask |= 1UL << info->type;
        }
 
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
index 310abf4..26e6e83 100644
--- a/arch/x86/kernel/dumpstack_64.c
+++ b/arch/x86/kernel/dumpstack_64.c
@@ -128,8 +128,11 @@ int get_stack_info(unsigned long *stack, struct 
task_struct *task,
         * just break out and report an unknown stack type.
         */
        if (visit_mask) {
-               if (*visit_mask & (1UL << info->type))
+               if (*visit_mask & (1UL << info->type)) {
+                       printk_deferred_once(KERN_WARNING "WARNING: stack 
recursion on stack type %d\n",
+                                            info->type);
                        goto unknown;
+               }
                *visit_mask |= 1UL << info->type;
        }
 
-- 
2.7.4

Reply via email to