On Tue, Jun 02, 2020 at 09:22:30AM +0800, Wangshaobo (bobo) wrote:
> so i think this question is related to ORC unwinder, could i ask if you have
> strategy or plan to avoid this problem ?

I suspect something like this would fix it (untested):

diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c
index 6ad43fc44556..8cf95ded1410 100644
--- a/arch/x86/kernel/stacktrace.c
+++ b/arch/x86/kernel/stacktrace.c
@@ -50,7 +50,7 @@ int arch_stack_walk_reliable(stack_trace_consume_fn 
consume_entry,
                if (regs) {
                        /* Success path for user tasks */
                        if (user_mode(regs))
-                               return 0;
+                               break;
 
                        /*
                         * Kernel mode registers on the stack indicate an
@@ -81,10 +81,6 @@ int arch_stack_walk_reliable(stack_trace_consume_fn 
consume_entry,
        if (unwind_error(&state))
                return -EINVAL;
 
-       /* Success path for non-user tasks, i.e. kthreads and idle tasks */
-       if (!(task->flags & (PF_KTHREAD | PF_IDLE)))
-               return -EINVAL;
-
        return 0;
 }
 
diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c
index 7f969b2d240f..d7396431261a 100644
--- a/arch/x86/kernel/unwind_orc.c
+++ b/arch/x86/kernel/unwind_orc.c
@@ -540,7 +540,7 @@ bool unwind_next_frame(struct unwind_state *state)
                state->sp = sp;
                state->regs = NULL;
                state->prev_regs = NULL;
-               state->signal = false;
+               state->signal = ((void *)state->ip == ret_from_fork);
                break;
 
        case ORC_TYPE_REGS:

Reply via email to