[PATCH] arm64:ftrace: add save_stack_trace_regs()

Will Deacon will.deacon at arm.com
Thu Sep 1 04:39:21 PDT 2016


On Thu, Sep 01, 2016 at 04:57:30PM +0530, Pratyush Anand wrote:
> On Fri, Jul 31, 2015 at 2:51 PM, Pratyush Anand <panand at redhat.com> wrote:
> > Implement save_stack_trace_regs, so that stacktrace of a kprobe events can be
> > obtained.
> >
> > Signed-off-by: Pratyush Anand <panand at redhat.com>
> > ---
> > Function will be useful only after having ARM64 kprobes upstreamed.
> > However, since there is no dependency in applying the patch, so it may be
> > upstreamed independently (if there is no other review comment).
> 
> 
> Since kprobe is already in mainline now. So any comment for this patch?
> It still applies cleanly to the latest upstream.

It would be nice if David or Akashi could review/test it.

Will

> > I see following stack trace for kfree with this patch in one of the case.
> >
> > echo stacktrace > /sys/kernel/debug/tracing/trace_options
> > echo "p kfree" >> /sys/kernel/debug/tracing/kprobe_events
> > echo 1 > /sys/kernel/debug/tracing/events/kprobes/enable
> > more /sys/kernel/debug/tracing/trace
> >             bash-3868  [001] d...  2863.068271: p_kfree_0: (kfree+0x0/0x194)
> >             bash-3868  [001] d...  2863.068276: <stack trace>
> >  => kfree
> >  => syscall_trace_exit
> >  => __sys_trace_return_skipped
> >
> >  arch/arm64/kernel/stacktrace.c | 18 ++++++++++++++++++
> >  1 file changed, 18 insertions(+)
> >
> > diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
> > index 407991bf79f5..c7fa0431ef3e 100644
> > --- a/arch/arm64/kernel/stacktrace.c
> > +++ b/arch/arm64/kernel/stacktrace.c
> > @@ -97,6 +97,24 @@ static int save_trace(struct stackframe *frame, void *d)
> >         return trace->nr_entries >= trace->max_entries;
> >  }
> >
> > +void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
> > +{
> > +       struct stack_trace_data data;
> > +       struct stackframe frame;
> > +
> > +       data.trace = trace;
> > +       data.skip = trace->skip;
> > +       data.no_sched_functions = 0;
> > +
> > +       frame.fp = regs->regs[29];
> > +       frame.sp = regs->sp;
> > +       frame.pc = regs->pc;
> > +
> > +       walk_stackframe(&frame, save_trace, &data);
> > +       if (trace->nr_entries < trace->max_entries)
> > +               trace->entries[trace->nr_entries++] = ULONG_MAX;
> > +}
> > +
> >  void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
> >  {
> >         struct stack_trace_data data;
> > --
> > 2.4.3
> >
> >
> > _______________________________________________
> > linux-arm-kernel mailing list
> > linux-arm-kernel at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 



More information about the linux-arm-kernel mailing list