diff mbox

ARM: add unwind annotations to ftrace asm

Message ID 1364076649-16841-1-git-send-email-rabin@rab.in (mailing list archive)
State New, archived
Headers show

Commit Message

Rabin Vincent March 23, 2013, 10:10 p.m. UTC
Add unwind annotations to the ftrace assembly code so that the function
tracer's stacktracing options (func_stack_trace, etc.) work when
CONFIG_ARM_UNWIND is enabled.

Signed-off-by: Rabin Vincent <rabin@rab.in>
---
 arch/arm/kernel/entry-common.S |   12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Jan Lübbe April 25, 2013, 2:39 p.m. UTC | #1
On Sat, 2013-03-23 at 23:10 +0100, Rabin Vincent wrote:
> Add unwind annotations to the ftrace assembly code so that the function
> tracer's stacktracing options (func_stack_trace, etc.) work when
> CONFIG_ARM_UNWIND is enabled.
> 
> Signed-off-by: Rabin Vincent <rabin@rab.in>

In my test this fixes func_stack_trace:

== without patch ==
# tracer: function
#
# entries-in-buffer/entries-written: 318/318   #P:1
#
#                              _-------=> irqs-off          
#                            /  _------=> need-resched      
#                            |/  _-----=> need-resched_lazy 
#                            ||/  _----=> hardirq/softirq   
#                            |||/  _---=> preempt-depth     
#                            ||||/  _--=> preempt-lazy-depth
#                            ||||| / _-=> migrate-disable   
#                            |||||| /     delay
#           TASK-PID   CPU#  |||||||    TIMESTAMP  FUNCTION
#              | |       |   |||||||       |         |
              sh-829   [000] d..h1..   838.966903: ktime_get <-tick_sched_timer
              sh-829   [000] d..h1..   838.966933: <stack trace>
 => ftrace_ops_no_ops
 => ftrace_graph_call
              sh-829   [000] d..h1..   838.966979: ktime_get <-clockevents_program_event
              sh-829   [000] d..h1..   838.966990: <stack trace>

== with patch ==
# tracer: function
#
# entries-in-buffer/entries-written: 678/678   #P:1
#
#                              _-------=> irqs-off          
#                            /  _------=> need-resched      
#                            |/  _-----=> need-resched_lazy 
#                            ||/  _----=> hardirq/softirq   
#                            |||/  _---=> preempt-depth     
#                            ||||/  _--=> preempt-lazy-depth
#                            ||||| / _-=> migrate-disable   
#                            |||||| /     delay
#           TASK-PID   CPU#  |||||||    TIMESTAMP  FUNCTION
#              | |       |   |||||||       |         |
              sh-828   [000] d..h2..   108.367156: ktime_get <-tick_sched_timer
              sh-828   [000] d..h2..   108.367224: <stack trace>
 => ftrace_ops_no_ops
 => ftrace_graph_call
 => ktime_get
 => tick_sched_timer
 => __run_hrtimer
 => hrtimer_interrupt
 => omap2_gp_timer_interrupt
 => handle_irq_event_percpu
 => handle_irq_event
 => handle_level_irq
 => generic_handle_irq
 => handle_IRQ
 => omap3_intc_handle_irq
 => __irq_svc
 => sub_preempt_count
 => cap_vm_enough_memory
 => security_vm_enough_memory_mm
 => mmap_region
 => do_mmap_pgoff
 => vm_mmap_pgoff
 => sys_mmap_pgoff
 => ret_fast_syscall

Thanks for this fix!

Regards,
Jan
diff mbox

Patch

diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 3248cde..fefd7f9 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -276,7 +276,13 @@  ENDPROC(ftrace_graph_caller_old)
  */
 
 .macro mcount_enter
+/*
+ * This pad compensates for the push {lr} at the call site.  Note that we are
+ * unable to unwind through a function which does not otherwise save its lr.
+ */
+ UNWIND(.pad	#4)
 	stmdb	sp!, {r0-r3, lr}
+ UNWIND(.save	{r0-r3, lr})
 .endm
 
 .macro mcount_get_lr reg
@@ -289,6 +295,7 @@  ENDPROC(ftrace_graph_caller_old)
 .endm
 
 ENTRY(__gnu_mcount_nc)
+UNWIND(.fnstart)
 #ifdef CONFIG_DYNAMIC_FTRACE
 	mov	ip, lr
 	ldmia	sp!, {lr}
@@ -296,17 +303,22 @@  ENTRY(__gnu_mcount_nc)
 #else
 	__mcount
 #endif
+UNWIND(.fnend)
 ENDPROC(__gnu_mcount_nc)
 
 #ifdef CONFIG_DYNAMIC_FTRACE
 ENTRY(ftrace_caller)
+UNWIND(.fnstart)
 	__ftrace_caller
+UNWIND(.fnend)
 ENDPROC(ftrace_caller)
 #endif
 
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 ENTRY(ftrace_graph_caller)
+UNWIND(.fnstart)
 	__ftrace_graph_caller
+UNWIND(.fnend)
 ENDPROC(ftrace_graph_caller)
 #endif