[PATCH] arm64:ftrace: add save_stack_trace_regs()

Pratyush Anand panand at redhat.com
Thu Sep 1 04:27:30 PDT 2016


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.

~Pratyush

>
> 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