On 11/30/2017, 08:57 PM, Josh Poimboeuf wrote: > So with those changes in mind, how about something like this (plus > comments)? > > for (unwind_start(&state, task, NULL, NULL); !unwind_done(&state); > unwind_next_frame(&state)) { > > regs = unwind_get_entry_regs(&state); > if (regs) { > if (user_mode(regs)) > goto success; > > if (IS_ENABLED(CONFIG_FRAME_POINTER)) > return -EINVAL; > } > > addr = unwind_get_return_address(&state); > if (!addr) > return -EINVAL; > > if (save_stack_address(trace, addr, false)) > return -EINVAL; > } > > return -EINVAL;
Kthreads and idle tasks hit this error as they have no user regs on the stack obviously :). So making it: if (!(task->flags & (PF_KTHREAD | PF_IDLE))) return -EINVAL; works, but is not reliable now. So I believe, we cannot live without unwind->error to differentiate between "unwind_done() == true" because: * full stack unwound and the stack type is set to UNKNOWN * unwinding failed and the stack type is set to UNKNOWN Or perhaps introduce stack type BOTTOM, NONE, or NOMORE meaning the bottom of the stacks reached? > success: > if (trace->nr_entries < trace->max_entries) > trace->entries[trace->nr_entries++] = ULONG_MAX; > > return 0; > > After these changes I believe we can enable > CONFIG_HAVE_RELIABLE_STACKTRACE for ORC. thanks, -- js suse labs