On Thu, Mar 20, 2025 at 10:46 AM Weinan Liu <wn...@google.com> wrote: > > On Thu, Mar 20, 2025 at 10:16 AM Song Liu <s...@kernel.org> wrote: > > > > static __always_inline void > > @@ -230,8 +231,26 @@ kunwind_next_frame_record(struct kunwind_state *state) > > new_fp = READ_ONCE(record->fp); > > new_pc = READ_ONCE(record->lr); > > > > - if (!new_fp && !new_pc) > > - return kunwind_next_frame_record_meta(state); > > + if (!new_fp && !new_pc) { > > + int ret; > > + > > + ret = kunwind_next_frame_record_meta(state); > > The exception case kunwind_next_regs_pc() will return 0 when unwind success. > Should we return a different value for the success case of > kunwind_next_regs_pc()?
I am assuming once the unwinder hits an exception boundary, the stack is not 100% reliable. This does mean we will return -EINVAL for some reliable stack walk, but this is safer and good enough for livepatch. IIUC, SFrame based unwinder should not have this limitation. Thanks, Song > > > + if (ret < 0) { > > + /* > > + * This covers two different conditions: > > + * 1. ret == -ENOENT, unwinding is done. > > + * 2. ret == -EINVAL, unwinding hit error. > > + */ > > + return ret; > > + } > > + /* > > + * Searching across exception boundaries. The stack is now > > + * unreliable. > > + */ > > + if (state->end_on_unreliable) > > + return -EINVAL; > > + return 0; > > + } >