]> git.dujemihanovic.xyz Git - linux.git/commitdiff
LoongArch: Set unwind stack type to unknown rather than set error flag
authorJinyang He <hejinyang@loongson.cn>
Sat, 9 Dec 2023 07:49:15 +0000 (15:49 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Sat, 9 Dec 2023 07:49:15 +0000 (15:49 +0800)
During unwinding, unwind_done() is used as an end condition. Normally it
unwind to the user stack and then set the stack type to unknown, which
is a normal exit. When something unexpected happens in unwind process
and we cannot unwind anymore, we should set the error flag, and also set
the stack type to unknown to indicate that the unwind process can not
continue. The error flag emphasizes that the unwind process produce an
unexpected error. There is no unexpected things when we unwind the PT_REGS
in the top of IRQ stack and find out that is an user mode PT_REGS. Thus,
we should not set error flag and just set stack type to unknown.

Reported-by: Hengqi Chen <hengqi.chen@gmail.com>
Acked-by: Hengqi Chen <hengqi.chen@gmail.com>
Signed-off-by: Jinyang He <hejinyang@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/stacktrace.c
arch/loongarch/kernel/unwind.c
arch/loongarch/kernel/unwind_prologue.c

index 92270f14db948271b00167ef0887703620b50c31..f623feb2129f12829b623d77c84d2ba6f677a689 100644 (file)
@@ -32,7 +32,7 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
        }
 
        for (unwind_start(&state, task, regs);
-            !unwind_done(&state) && !unwind_error(&state); unwind_next_frame(&state)) {
+            !unwind_done(&state); unwind_next_frame(&state)) {
                addr = unwind_get_return_address(&state);
                if (!addr || !consume_entry(cookie, addr))
                        break;
index ba324ba76fa15605d9ada6c26101ce78aa108df1..a463d6961344c0899aacd72a8951b9cc5d18ea83 100644 (file)
@@ -28,6 +28,5 @@ bool default_next_frame(struct unwind_state *state)
 
        } while (!get_stack_info(state->sp, state->task, info));
 
-       state->error = true;
        return false;
 }
index 55afc27320e12a1c52fd98445ef32f383f1d2bf1..929ae240280a5fb67cb9b34fde0f84045279a3eb 100644 (file)
@@ -227,7 +227,7 @@ static bool next_frame(struct unwind_state *state)
        } while (!get_stack_info(state->sp, state->task, info));
 
 out:
-       state->error = true;
+       state->stack_info.type = STACK_TYPE_UNKNOWN;
        return false;
 }