Re: [PATCH v3 1/2] arm64: Implement arch_stack_walk_reliable

Song Liu
2025-03-20T17:54:44Z

On Thu, Mar 20, 2025 at 10:46 AM Weinan Liu <wnliu@google.com> wrote:
>
> On Thu, Mar 20, 2025 at 10:16 AM Song Liu <song@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;
> > + }
>