Messages in this thread | | | Subject | Re: [PATCH 1/2] x86/stacktrace: do not fail when regs on stack for ORC | From | Jiri Slaby <> | Date | Thu, 14 Dec 2017 22:58:35 +0100 |
| |
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
| |