MIPS: oprofile: Backtrace: don't fail on leaf functions
authorAaro Koskinen <aaro.koskinen@nsn.com>
Fri, 17 Oct 2014 15:10:26 +0000 (18:10 +0300)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 24 Nov 2014 06:45:31 +0000 (07:45 +0100)
Continue the backtrace if we cannot find SP adjustment and RA save. In
that case, just assume the current RA. This allows us to get samples of
frequent callers of e.g. GLIBC memset().

Signed-off-by: Aaro Koskinen <aaro.koskinen@nsn.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/8109/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/oprofile/backtrace.c

index 83a1dfd8f0e3c34d02cbe24448f5c5407852f942..5e645c9a31627430191762cc1bc3d423b3802c92 100644 (file)
@@ -65,7 +65,7 @@ static inline int is_end_of_function_marker(union mips_instruction *ip)
  * - handle cases where the stack is adjusted inside a function
  *     (generally doesn't happen)
  * - find optimal value for max_instr_check
- * - try to find a way to handle leaf functions
+ * - try to find a better way to handle leaf functions
  */
 
 static inline int unwind_user_frame(struct stackframe *old_frame,
@@ -104,7 +104,7 @@ static inline int unwind_user_frame(struct stackframe *old_frame,
        }
 
        if (!ra_offset || !stack_size)
-               return -1;
+               goto done;
 
        if (ra_offset) {
                new_frame.ra = old_frame->sp + ra_offset;
@@ -121,6 +121,7 @@ static inline int unwind_user_frame(struct stackframe *old_frame,
        if (new_frame.sp > old_frame->sp)
                return -2;
 
+done:
        new_frame.pc = old_frame->ra;
        *old_frame = new_frame;