arm64: stacktrace: avoid listing stacktrace functions in stacktrace
[sfrench/cifs-2.6.git] / arch / arm64 / kernel / stacktrace.c
index 3144584617e7a474cc9c15e829d294bb4315ebb0..76809ccd309ccaf330e45ac4b814922ae5949624 100644 (file)
@@ -140,7 +140,8 @@ void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
                trace->entries[trace->nr_entries++] = ULONG_MAX;
 }
 
-void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
+static noinline void __save_stack_trace(struct task_struct *tsk,
+       struct stack_trace *trace, unsigned int nosched)
 {
        struct stack_trace_data data;
        struct stackframe frame;
@@ -150,15 +151,16 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
 
        data.trace = trace;
        data.skip = trace->skip;
+       data.no_sched_functions = nosched;
 
        if (tsk != current) {
-               data.no_sched_functions = 1;
                frame.fp = thread_saved_fp(tsk);
                frame.pc = thread_saved_pc(tsk);
        } else {
-               data.no_sched_functions = 0;
+               /* We don't want this function nor the caller */
+               data.skip += 2;
                frame.fp = (unsigned long)__builtin_frame_address(0);
-               frame.pc = (unsigned long)save_stack_trace_tsk;
+               frame.pc = (unsigned long)__save_stack_trace;
        }
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
        frame.graph = tsk->curr_ret_stack;
@@ -172,9 +174,15 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
 }
 EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
 
+void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
+{
+       __save_stack_trace(tsk, trace, 1);
+}
+
 void save_stack_trace(struct stack_trace *trace)
 {
-       save_stack_trace_tsk(current, trace);
+       __save_stack_trace(current, trace, 0);
 }
+
 EXPORT_SYMBOL_GPL(save_stack_trace);
 #endif