public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
@ 2009-05-01 22:38 Tim Bird
  2009-05-02  0:11 ` Frederic Weisbecker
  0 siblings, 1 reply; 8+ messages in thread
From: Tim Bird @ 2009-05-01 22:38 UTC (permalink / raw)
  To: linux kernel, linux-arm-kernel, Steven Rostedt, Ingo Molnar,
	Frederic Weisbecker, Uwe Kleine-König, Russell King

Add ftrace function-graph tracer support for ARM.

This includes adding code in mcount to check for
(and call) a registered function graph trace entry
routine, and adding infrastructure to support a return
trampoline to the threadinfo structure.

The code in arch/arm/kernel/ftrace_return.c was
cloned from arch/x86/kernel/ftrace.c

IRQENTRY_TEXT was added to vmlinux.lds.S (to eliminate
a compiler error on kernel/trace/trace_functions_graph.c),
although no routines were marked as __irq_entry.

This works for me with a gcc 4.1.1 compiler on an
OMAP OSK board.  This is against -tip (or at least,
-tip a few weeks ago - 2.6.30-rc3)

This (v2) patch addresses previously received feedback,
except for one issue.  In this version of the code,
a function_graph tracer overrides regular function
tracers.  I'll try to address that in a subsequent
patch, but I didn't want to go too long without posting
something.

Note: this code is much cleaner now that much of the
common return-handling code was moved into
kernel/trace_functions_graph.c

Signed-off-by: Tim Bird <tim.bird@am.sony.com>
---
 arch/arm/Kconfig                |    1
 arch/arm/kernel/Makefile        |    4 +--
 arch/arm/kernel/entry-common.S  |   34 ++++++++++++++++++++++++++++++
 arch/arm/kernel/ftrace_return.c |   44 ++++++++++++++++++++++++++++++++++++++++
 arch/arm/kernel/vmlinux.lds.S   |    1
 5 files changed, 81 insertions(+), 3 deletions(-)

--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -17,6 +17,7 @@ config ARM
 	select HAVE_KPROBES if (!XIP_KERNEL)
 	select HAVE_KRETPROBES if (HAVE_KPROBES)
 	select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
+	select HAVE_FUNCTION_GRAPH_TRACER if (!XIP_KERNEL)
 	select HAVE_GENERIC_DMA_COHERENT
 	help
 	  The ARM series is a line of low-power-consumption RISC chip designs
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -4,9 +4,8 @@

 AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)

-ifdef CONFIG_DYNAMIC_FTRACE
 CFLAGS_REMOVE_ftrace.o = -pg
-endif
+CFLAGS_REMOVE_ftrace_return.o = -pg

 # Object file lists.

@@ -23,6 +22,7 @@ obj-$(CONFIG_ISA_DMA)		+= dma-isa.o
 obj-$(CONFIG_PCI)		+= bios32.o isa.o
 obj-$(CONFIG_SMP)		+= smp.o
 obj-$(CONFIG_DYNAMIC_FTRACE)	+= ftrace.o
+obj-$(CONFIG_FUNCTION_GRAPH_TRACER)	+= ftrace_return.o
 obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o
 obj-$(CONFIG_KPROBES)		+= kprobes.o kprobes-decode.o
 obj-$(CONFIG_ATAGS_PROC)	+= atags.o
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -112,6 +112,11 @@ ENTRY(mcount)
 	mov r0, lr
 	sub r0, r0, #MCOUNT_INSN_SIZE

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+	@ FIXTHIS - DYNAMIC_FTRACE does not support function graph tracing
+	@ when the dynamic work is revived, this should be supported as well
+#endif
+
 	.globl mcount_call
 mcount_call:
 	bl ftrace_stub
@@ -139,8 +144,16 @@ ENTRY(mcount)
 	adr r0, ftrace_stub
 	cmp r0, r2
 	bne trace
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+	ldr r1, =ftrace_graph_return
+	ldr r2, [r1]
+	cmp r0, r2		@ if *ftrace_graph_return != ftrace_stub
+	bne ftrace_graph_caller
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
 	ldr lr, [fp, #-4]			@ restore lr
-	ldmia sp!, {r0-r3, pc}
+	ldmia sp!, {r0-r3, pc}			@ return doing nothing

 trace:
 	ldr r1, [fp, #-4]			@ lr of instrumented routine
@@ -151,6 +164,25 @@ trace:
 	mov lr, r1				@ restore lr
 	ldmia sp!, {r0-r3, pc}

+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ENTRY(ftrace_graph_caller)
+	sub r0, fp, #4			@ &lr of instrumented routine (&parent)
+	mov r1, lr			@ instrumented routine (func)
+	sub r1, r1, #MCOUNT_INSN_SIZE
+	bl prepare_ftrace_return
+	ldr lr, [fp, #-4]		@ restore lr
+	ldmia sp!, {r0-r3, pc}
+
+	.globl return_to_handler
+return_to_handler:
+	stmdb sp!, {r0-r3}
+	bl ftrace_return_to_handler
+	mov lr, r0			@ r0 has real ret addr
+	ldmia sp!, {r0-r3}
+	mov pc, lr
+
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
 #endif /* CONFIG_DYNAMIC_FTRACE */

 	.globl ftrace_stub
--- /dev/null
+++ b/arch/arm/kernel/ftrace_return.c
@@ -0,0 +1,44 @@
+/*
+ * function return tracing support.
+ *
+ * Copyright (C) 2009 Tim Bird <tim.bird@am.sony.com>
+ *
+ * For licencing details, see COPYING.
+ *
+ * Defines routine needed for ARM return trampoline for tracing
+ * function exits.
+ */
+
+#include <linux/ftrace.h>
+
+/*
+ * Hook the return address and push it in the stack of return addrs
+ * in current thread info.
+ */
+void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
+{
+	unsigned long old;
+
+	struct ftrace_graph_ent trace;
+	unsigned long return_hooker = (unsigned long)
+				&return_to_handler;
+
+	if (unlikely(atomic_read(&current->tracing_graph_pause)))
+		return;
+
+	old = *parent;
+	*parent = return_hooker;
+
+	if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) {
+		*parent = old;
+		return;
+	}
+
+	trace.func = self_addr;
+
+	/* Only trace if the calling function expects to */
+	if (!ftrace_graph_entry(&trace)) {
+		current->curr_ret_stack--;
+		*parent = old;
+	}
+}
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -99,6 +99,7 @@ SECTIONS
 			SCHED_TEXT
 			LOCK_TEXT
 			KPROBES_TEXT
+			IRQENTRY_TEXT
 #ifdef CONFIG_MMU
 			*(.fixup)
 #endif


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
  2009-05-01 22:38 [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2 Tim Bird
@ 2009-05-02  0:11 ` Frederic Weisbecker
  2009-05-02 15:15   ` Uwe Kleine-König
  2009-05-09 16:14   ` Frédéric Weisbecker
  0 siblings, 2 replies; 8+ messages in thread
From: Frederic Weisbecker @ 2009-05-02  0:11 UTC (permalink / raw)
  To: Tim Bird
  Cc: linux kernel, linux-arm-kernel, Steven Rostedt, Ingo Molnar,
	Uwe Kleine-König, Russell King

On Fri, May 01, 2009 at 03:38:07PM -0700, Tim Bird wrote:
> Add ftrace function-graph tracer support for ARM.
> 
> This includes adding code in mcount to check for
> (and call) a registered function graph trace entry
> routine, and adding infrastructure to support a return
> trampoline to the threadinfo structure.
> 
> The code in arch/arm/kernel/ftrace_return.c was
> cloned from arch/x86/kernel/ftrace.c
> 
> IRQENTRY_TEXT was added to vmlinux.lds.S (to eliminate
> a compiler error on kernel/trace/trace_functions_graph.c),
> although no routines were marked as __irq_entry.
> 
> This works for me with a gcc 4.1.1 compiler on an
> OMAP OSK board.  This is against -tip (or at least,
> -tip a few weeks ago - 2.6.30-rc3)
> 
> This (v2) patch addresses previously received feedback,
> except for one issue.  In this version of the code,
> a function_graph tracer overrides regular function
> tracers.  I'll try to address that in a subsequent
> patch, but I didn't want to go too long without posting
> something.
> 
> Note: this code is much cleaner now that much of the
> common return-handling code was moved into
> kernel/trace_functions_graph.c
> 
> Signed-off-by: Tim Bird <tim.bird@am.sony.com>
> ---
>  arch/arm/Kconfig                |    1
>  arch/arm/kernel/Makefile        |    4 +--
>  arch/arm/kernel/entry-common.S  |   34 ++++++++++++++++++++++++++++++
>  arch/arm/kernel/ftrace_return.c |   44 ++++++++++++++++++++++++++++++++++++++++
>  arch/arm/kernel/vmlinux.lds.S   |    1
>  5 files changed, 81 insertions(+), 3 deletions(-)
> 
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -17,6 +17,7 @@ config ARM
>  	select HAVE_KPROBES if (!XIP_KERNEL)
>  	select HAVE_KRETPROBES if (HAVE_KPROBES)
>  	select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
> +	select HAVE_FUNCTION_GRAPH_TRACER if (!XIP_KERNEL)
>  	select HAVE_GENERIC_DMA_COHERENT
>  	help
>  	  The ARM series is a line of low-power-consumption RISC chip designs
> --- a/arch/arm/kernel/Makefile
> +++ b/arch/arm/kernel/Makefile
> @@ -4,9 +4,8 @@
> 
>  AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
> 
> -ifdef CONFIG_DYNAMIC_FTRACE
>  CFLAGS_REMOVE_ftrace.o = -pg
> -endif
> +CFLAGS_REMOVE_ftrace_return.o = -pg
> 
>  # Object file lists.
> 
> @@ -23,6 +22,7 @@ obj-$(CONFIG_ISA_DMA)		+= dma-isa.o
>  obj-$(CONFIG_PCI)		+= bios32.o isa.o
>  obj-$(CONFIG_SMP)		+= smp.o
>  obj-$(CONFIG_DYNAMIC_FTRACE)	+= ftrace.o
> +obj-$(CONFIG_FUNCTION_GRAPH_TRACER)	+= ftrace_return.o
>  obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o
>  obj-$(CONFIG_KPROBES)		+= kprobes.o kprobes-decode.o
>  obj-$(CONFIG_ATAGS_PROC)	+= atags.o
> --- a/arch/arm/kernel/entry-common.S
> +++ b/arch/arm/kernel/entry-common.S
> @@ -112,6 +112,11 @@ ENTRY(mcount)
>  	mov r0, lr
>  	sub r0, r0, #MCOUNT_INSN_SIZE
> 
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +	@ FIXTHIS - DYNAMIC_FTRACE does not support function graph tracing
> +	@ when the dynamic work is revived, this should be supported as well
> +#endif
> +
>  	.globl mcount_call
>  mcount_call:
>  	bl ftrace_stub
> @@ -139,8 +144,16 @@ ENTRY(mcount)
>  	adr r0, ftrace_stub
>  	cmp r0, r2
>  	bne trace
> +
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +	ldr r1, =ftrace_graph_return
> +	ldr r2, [r1]
> +	cmp r0, r2		@ if *ftrace_graph_return != ftrace_stub
> +	bne ftrace_graph_caller
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> +
>  	ldr lr, [fp, #-4]			@ restore lr
> -	ldmia sp!, {r0-r3, pc}
> +	ldmia sp!, {r0-r3, pc}			@ return doing nothing
> 
>  trace:
>  	ldr r1, [fp, #-4]			@ lr of instrumented routine
> @@ -151,6 +164,25 @@ trace:
>  	mov lr, r1				@ restore lr
>  	ldmia sp!, {r0-r3, pc}
> 
> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> +ENTRY(ftrace_graph_caller)
> +	sub r0, fp, #4			@ &lr of instrumented routine (&parent)
> +	mov r1, lr			@ instrumented routine (func)
> +	sub r1, r1, #MCOUNT_INSN_SIZE
> +	bl prepare_ftrace_return
> +	ldr lr, [fp, #-4]		@ restore lr
> +	ldmia sp!, {r0-r3, pc}
> +
> +	.globl return_to_handler
> +return_to_handler:
> +	stmdb sp!, {r0-r3}
> +	bl ftrace_return_to_handler
> +	mov lr, r0			@ r0 has real ret addr
> +	ldmia sp!, {r0-r3}
> +	mov pc, lr
> +
> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */



Looks good.



>  #endif /* CONFIG_DYNAMIC_FTRACE */
> 
>  	.globl ftrace_stub
> --- /dev/null
> +++ b/arch/arm/kernel/ftrace_return.c



Because it is more commonly known as function graph,
I would suggest ftrace_graph.c so that people can
find it more easily.



> @@ -0,0 +1,44 @@
> +/*
> + * function return tracing support.
> + *
> + * Copyright (C) 2009 Tim Bird <tim.bird@am.sony.com>
> + *
> + * For licencing details, see COPYING.
> + *
> + * Defines routine needed for ARM return trampoline for tracing
> + * function exits.
> + */
> +
> +#include <linux/ftrace.h>
> +
> +/*
> + * Hook the return address and push it in the stack of return addrs
> + * in current thread info.
> + */
> +void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
> +{
> +	unsigned long old;
> +
> +	struct ftrace_graph_ent trace;
> +	unsigned long return_hooker = (unsigned long)
> +				&return_to_handler;
> +
> +	if (unlikely(atomic_read(&current->tracing_graph_pause)))
> +		return;
> +
> +	old = *parent;
> +	*parent = return_hooker;
> +
> +	if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) {
> +		*parent = old;
> +		return;
> +	}
> +
> +	trace.func = self_addr;
> +
> +	/* Only trace if the calling function expects to */
> +	if (!ftrace_graph_entry(&trace)) {
> +		current->curr_ret_stack--;
> +		*parent = old;
> +	}
> +}
> --- a/arch/arm/kernel/vmlinux.lds.S
> +++ b/arch/arm/kernel/vmlinux.lds.S
> @@ -99,6 +99,7 @@ SECTIONS
>  			SCHED_TEXT
>  			LOCK_TEXT
>  			KPROBES_TEXT
> +			IRQENTRY_TEXT
>  #ifdef CONFIG_MMU
>  			*(.fixup)
>  #endif


Well, it looks good to me.
May be you can also add the fault protection against the return address,
as a paranoid check. But that can be done later.

Also I wonder how far we are from the dynamic ftrace support, which seems
half implemented or broken or not tested for a while?

Thanks!

Acked-by: Frederic Weisbecker <fweisbec@gmail.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
  2009-05-02  0:11 ` Frederic Weisbecker
@ 2009-05-02 15:15   ` Uwe Kleine-König
  2009-05-02 19:21     ` Steven Rostedt
  2009-05-09 16:14   ` Frédéric Weisbecker
  1 sibling, 1 reply; 8+ messages in thread
From: Uwe Kleine-König @ 2009-05-02 15:15 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: Tim Bird, linux kernel, linux-arm-kernel, Steven Rostedt,
	Ingo Molnar, Russell King

Hello,

> Also I wonder how far we are from the dynamic ftrace support, which seems
> half implemented or broken or not tested for a while?
Commit 07c4cc1cdaa08fcb6c0275dd7be49eae37260169 suggests that "the new
MCOUNT_RECORD method" needs to be implemented.  I don't know the
details, though (yet).

Best regards
Uwe

-- 
Pengutronix e.K.                              | Uwe Kleine-König            |
Industrial Linux Solutions                    | http://www.pengutronix.de/  |

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
  2009-05-02 15:15   ` Uwe Kleine-König
@ 2009-05-02 19:21     ` Steven Rostedt
  0 siblings, 0 replies; 8+ messages in thread
From: Steven Rostedt @ 2009-05-02 19:21 UTC (permalink / raw)
  To: Uwe Kleine-König
  Cc: Frederic Weisbecker, Tim Bird, linux kernel, linux-arm-kernel,
	Ingo Molnar, Russell King


On Sat, 2 May 2009, Uwe Kleine-K?nig wrote:

> Hello,
> 
> > Also I wonder how far we are from the dynamic ftrace support, which seems
> > half implemented or broken or not tested for a while?
> Commit 07c4cc1cdaa08fcb6c0275dd7be49eae37260169 suggests that "the new
> MCOUNT_RECORD method" needs to be implemented.  I don't know the
> details, though (yet).

The new MCOUNT_RECORD method means to update scripts/recordmcount.pl. 
There is an "arm" section in that script added by:

 e58918ab9d4cd375f6d842e6d88cf4d7a55cbfcc

-- Steve


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
  2009-05-02  0:11 ` Frederic Weisbecker
  2009-05-02 15:15   ` Uwe Kleine-König
@ 2009-05-09 16:14   ` Frédéric Weisbecker
  2009-05-15 21:06     ` Russell King - ARM Linux
  1 sibling, 1 reply; 8+ messages in thread
From: Frédéric Weisbecker @ 2009-05-09 16:14 UTC (permalink / raw)
  To: Tim Bird, Russell King, Ingo Molnar
  Cc: linux kernel, linux-arm-kernel, Steven Rostedt,
	Uwe Kleine-König

2009/5/2 Frederic Weisbecker <fweisbec@gmail.com>:
> On Fri, May 01, 2009 at 03:38:07PM -0700, Tim Bird wrote:
>> Add ftrace function-graph tracer support for ARM.
>>
>> This includes adding code in mcount to check for
>> (and call) a registered function graph trace entry
>> routine, and adding infrastructure to support a return
>> trampoline to the threadinfo structure.
>>
>> The code in arch/arm/kernel/ftrace_return.c was
>> cloned from arch/x86/kernel/ftrace.c
>>
>> IRQENTRY_TEXT was added to vmlinux.lds.S (to eliminate
>> a compiler error on kernel/trace/trace_functions_graph.c),
>> although no routines were marked as __irq_entry.
>>
>> This works for me with a gcc 4.1.1 compiler on an
>> OMAP OSK board.  This is against -tip (or at least,
>> -tip a few weeks ago - 2.6.30-rc3)
>>
>> This (v2) patch addresses previously received feedback,
>> except for one issue.  In this version of the code,
>> a function_graph tracer overrides regular function
>> tracers.  I'll try to address that in a subsequent
>> patch, but I didn't want to go too long without posting
>> something.
>>
>> Note: this code is much cleaner now that much of the
>> common return-handling code was moved into
>> kernel/trace_functions_graph.c
>>
>> Signed-off-by: Tim Bird <tim.bird@am.sony.com>
>> ---
>>  arch/arm/Kconfig                |    1
>>  arch/arm/kernel/Makefile        |    4 +--
>>  arch/arm/kernel/entry-common.S  |   34 ++++++++++++++++++++++++++++++
>>  arch/arm/kernel/ftrace_return.c |   44 ++++++++++++++++++++++++++++++++++++++++
>>  arch/arm/kernel/vmlinux.lds.S   |    1
>>  5 files changed, 81 insertions(+), 3 deletions(-)


Ingo, Russell.
What do you think about this?

If you accept it to be merged, in which tree is it most suitable?
I guess it would have better chances to be tested in the Arm tree. But
it would be closer to latest changes in -tip, although
the function graph tracer hasn't been changed since -rc1 IIRC.

Frederic.


>> --- a/arch/arm/Kconfig
>> +++ b/arch/arm/Kconfig
>> @@ -17,6 +17,7 @@ config ARM
>>       select HAVE_KPROBES if (!XIP_KERNEL)
>>       select HAVE_KRETPROBES if (HAVE_KPROBES)
>>       select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
>> +     select HAVE_FUNCTION_GRAPH_TRACER if (!XIP_KERNEL)
>>       select HAVE_GENERIC_DMA_COHERENT
>>       help
>>         The ARM series is a line of low-power-consumption RISC chip designs
>> --- a/arch/arm/kernel/Makefile
>> +++ b/arch/arm/kernel/Makefile
>> @@ -4,9 +4,8 @@
>>
>>  AFLAGS_head.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
>>
>> -ifdef CONFIG_DYNAMIC_FTRACE
>>  CFLAGS_REMOVE_ftrace.o = -pg
>> -endif
>> +CFLAGS_REMOVE_ftrace_return.o = -pg
>>
>>  # Object file lists.
>>
>> @@ -23,6 +22,7 @@ obj-$(CONFIG_ISA_DMA)               += dma-isa.o
>>  obj-$(CONFIG_PCI)            += bios32.o isa.o
>>  obj-$(CONFIG_SMP)            += smp.o
>>  obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o
>> +obj-$(CONFIG_FUNCTION_GRAPH_TRACER)  += ftrace_return.o
>>  obj-$(CONFIG_KEXEC)          += machine_kexec.o relocate_kernel.o
>>  obj-$(CONFIG_KPROBES)                += kprobes.o kprobes-decode.o
>>  obj-$(CONFIG_ATAGS_PROC)     += atags.o
>> --- a/arch/arm/kernel/entry-common.S
>> +++ b/arch/arm/kernel/entry-common.S
>> @@ -112,6 +112,11 @@ ENTRY(mcount)
>>       mov r0, lr
>>       sub r0, r0, #MCOUNT_INSN_SIZE
>>
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +     @ FIXTHIS - DYNAMIC_FTRACE does not support function graph tracing
>> +     @ when the dynamic work is revived, this should be supported as well
>> +#endif
>> +
>>       .globl mcount_call
>>  mcount_call:
>>       bl ftrace_stub
>> @@ -139,8 +144,16 @@ ENTRY(mcount)
>>       adr r0, ftrace_stub
>>       cmp r0, r2
>>       bne trace
>> +
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +     ldr r1, =ftrace_graph_return
>> +     ldr r2, [r1]
>> +     cmp r0, r2              @ if *ftrace_graph_return != ftrace_stub
>> +     bne ftrace_graph_caller
>> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
>> +
>>       ldr lr, [fp, #-4]                       @ restore lr
>> -     ldmia sp!, {r0-r3, pc}
>> +     ldmia sp!, {r0-r3, pc}                  @ return doing nothing
>>
>>  trace:
>>       ldr r1, [fp, #-4]                       @ lr of instrumented routine
>> @@ -151,6 +164,25 @@ trace:
>>       mov lr, r1                              @ restore lr
>>       ldmia sp!, {r0-r3, pc}
>>
>> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
>> +ENTRY(ftrace_graph_caller)
>> +     sub r0, fp, #4                  @ &lr of instrumented routine (&parent)
>> +     mov r1, lr                      @ instrumented routine (func)
>> +     sub r1, r1, #MCOUNT_INSN_SIZE
>> +     bl prepare_ftrace_return
>> +     ldr lr, [fp, #-4]               @ restore lr
>> +     ldmia sp!, {r0-r3, pc}
>> +
>> +     .globl return_to_handler
>> +return_to_handler:
>> +     stmdb sp!, {r0-r3}
>> +     bl ftrace_return_to_handler
>> +     mov lr, r0                      @ r0 has real ret addr
>> +     ldmia sp!, {r0-r3}
>> +     mov pc, lr
>> +
>> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
>
>
>
> Looks good.
>
>
>
>>  #endif /* CONFIG_DYNAMIC_FTRACE */
>>
>>       .globl ftrace_stub
>> --- /dev/null
>> +++ b/arch/arm/kernel/ftrace_return.c
>
>
>
> Because it is more commonly known as function graph,
> I would suggest ftrace_graph.c so that people can
> find it more easily.
>
>
>
>> @@ -0,0 +1,44 @@
>> +/*
>> + * function return tracing support.
>> + *
>> + * Copyright (C) 2009 Tim Bird <tim.bird@am.sony.com>
>> + *
>> + * For licencing details, see COPYING.
>> + *
>> + * Defines routine needed for ARM return trampoline for tracing
>> + * function exits.
>> + */
>> +
>> +#include <linux/ftrace.h>
>> +
>> +/*
>> + * Hook the return address and push it in the stack of return addrs
>> + * in current thread info.
>> + */
>> +void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
>> +{
>> +     unsigned long old;
>> +
>> +     struct ftrace_graph_ent trace;
>> +     unsigned long return_hooker = (unsigned long)
>> +                             &return_to_handler;
>> +
>> +     if (unlikely(atomic_read(&current->tracing_graph_pause)))
>> +             return;
>> +
>> +     old = *parent;
>> +     *parent = return_hooker;
>> +
>> +     if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) {
>> +             *parent = old;
>> +             return;
>> +     }
>> +
>> +     trace.func = self_addr;
>> +
>> +     /* Only trace if the calling function expects to */
>> +     if (!ftrace_graph_entry(&trace)) {
>> +             current->curr_ret_stack--;
>> +             *parent = old;
>> +     }
>> +}
>> --- a/arch/arm/kernel/vmlinux.lds.S
>> +++ b/arch/arm/kernel/vmlinux.lds.S
>> @@ -99,6 +99,7 @@ SECTIONS
>>                       SCHED_TEXT
>>                       LOCK_TEXT
>>                       KPROBES_TEXT
>> +                     IRQENTRY_TEXT
>>  #ifdef CONFIG_MMU
>>                       *(.fixup)
>>  #endif
>
>
> Well, it looks good to me.
> May be you can also add the fault protection against the return address,
> as a paranoid check. But that can be done later.
>
> Also I wonder how far we are from the dynamic ftrace support, which seems
> half implemented or broken or not tested for a while?
>
> Thanks!
>
> Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
  2009-05-09 16:14   ` Frédéric Weisbecker
@ 2009-05-15 21:06     ` Russell King - ARM Linux
  2009-05-20  2:34       ` Frederic Weisbecker
  0 siblings, 1 reply; 8+ messages in thread
From: Russell King - ARM Linux @ 2009-05-15 21:06 UTC (permalink / raw)
  To: Frédéric Weisbecker
  Cc: Tim Bird, Ingo Molnar, linux kernel, linux-arm-kernel,
	Steven Rostedt, Uwe Kleine-König

On Sat, May 09, 2009 at 06:14:32PM +0200, Frédéric Weisbecker wrote:
> Ingo, Russell.
> What do you think about this?

If it's suitable for the next merge window, lets get it queued up for
it.    What are the dependencies for the patch?  Does it rely on
anything queued in anyone elses tree (eg, the addition of
ftrace_return_to_handler) ?

However, I'm not sure that this code is entirely right (and I'm not
sure what's going on with this patch - my editor is randomly changing
the placement of characters in it.  Are you submitting patches using
UTF-8 characters in the code?)

> >> @@ -139,8 +144,16 @@ ENTRY(mcount)
> >>       adr r0, ftrace_stub
> >>       cmp r0, r2
> >>       bne trace

If this is r0 != ftrace_stub, go to trace.  So the next block will
only be executed if r0 /was/ ftrace_stub, in which case it can't be
ftrace_graph_return.

> >> +
> >> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> >> +     ldr r1, =ftrace_graph_return
> >> +     ldr r2, [r1]
> >> +     cmp r0, r2              @ if *ftrace_graph_return != ftrace_stub
> >> +     bne ftrace_graph_caller
> >> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> >> +
> >>       ldr lr, [fp, #-4]                       @ restore lr
> >> -     ldmia sp!, {r0-r3, pc}
> >> +     ldmia sp!, {r0-r3, pc}                  @ return doing nothing
> >>
> >>  trace:

So surely you want your code above placed here?

> >>       ldr r1, [fp, #-4]                       @ lr of instrumented routine
> >> @@ -151,6 +164,25 @@ trace:
> >>       mov lr, r1                              @ restore lr
> >>       ldmia sp!, {r0-r3, pc}
> >>
> >> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> >> +ENTRY(ftrace_graph_caller)
> >> +     sub r0, fp, #4                  @ &lr of instrumented routine (&parent)
> >> +     mov r1, lr                      @ instrumented routine (func)
> >> +     sub r1, r1, #MCOUNT_INSN_SIZE
> >> +     bl prepare_ftrace_return
> >> +     ldr lr, [fp, #-4]               @ restore lr
> >> +     ldmia sp!, {r0-r3, pc}
> >> +
> >> +     .globl return_to_handler
> >> +return_to_handler:
> >> +     stmdb sp!, {r0-r3}
> >> +     bl ftrace_return_to_handler
> >> +     mov lr, r0                      @ r0 has real ret addr
> >> +     ldmia sp!, {r0-r3}
> >> +     mov pc, lr
> >> +
> >> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> >
> >
> >
> > Looks good.
> >
> >
> >
> >>  #endif /* CONFIG_DYNAMIC_FTRACE */
> >>
> >>       .globl ftrace_stub
> >> --- /dev/null
> >> +++ b/arch/arm/kernel/ftrace_return.c
> >
> >
> >
> > Because it is more commonly known as function graph,
> > I would suggest ftrace_graph.c so that people can
> > find it more easily.
> >
> >
> >
> >> @@ -0,0 +1,44 @@
> >> +/*
> >> + * function return tracing support.
> >> + *
> >> + * Copyright (C) 2009 Tim Bird <tim.bird@am.sony.com>
> >> + *
> >> + * For licencing details, see COPYING.
> >> + *
> >> + * Defines routine needed for ARM return trampoline for tracing
> >> + * function exits.
> >> + */
> >> +
> >> +#include <linux/ftrace.h>
> >> +
> >> +/*
> >> + * Hook the return address and push it in the stack of return addrs
> >> + * in current thread info.
> >> + */
> >> +void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
> >> +{
> >> +     unsigned long old;
> >> +
> >> +     struct ftrace_graph_ent trace;
> >> +     unsigned long return_hooker = (unsigned long)
> >> +                             &return_to_handler;
> >> +
> >> +     if (unlikely(atomic_read(&current->tracing_graph_pause)))
> >> +             return;
> >> +
> >> +     old = *parent;
> >> +     *parent = return_hooker;
> >> +
> >> +     if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) {
> >> +             *parent = old;
> >> +             return;
> >> +     }
> >> +
> >> +     trace.func = self_addr;
> >> +
> >> +     /* Only trace if the calling function expects to */
> >> +     if (!ftrace_graph_entry(&trace)) {
> >> +             current->curr_ret_stack--;
> >> +             *parent = old;
> >> +     }
> >> +}
> >> --- a/arch/arm/kernel/vmlinux.lds.S
> >> +++ b/arch/arm/kernel/vmlinux.lds.S
> >> @@ -99,6 +99,7 @@ SECTIONS
> >>                       SCHED_TEXT
> >>                       LOCK_TEXT
> >>                       KPROBES_TEXT
> >> +                     IRQENTRY_TEXT
> >>  #ifdef CONFIG_MMU
> >>                       *(.fixup)
> >>  #endif
> >
> >
> > Well, it looks good to me.
> > May be you can also add the fault protection against the return address,
> > as a paranoid check. But that can be done later.
> >
> > Also I wonder how far we are from the dynamic ftrace support, which seems
> > half implemented or broken or not tested for a while?
> >
> > Thanks!
> >
> > Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
> >
> 
> -------------------------------------------------------------------
> List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
> FAQ:        http://www.arm.linux.org.uk/mailinglists/faq.php
> Etiquette:  http://www.arm.linux.org.uk/mailinglists/etiquette.php

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
  2009-05-15 21:06     ` Russell King - ARM Linux
@ 2009-05-20  2:34       ` Frederic Weisbecker
  2009-05-20  8:11         ` Russell King - ARM Linux
  0 siblings, 1 reply; 8+ messages in thread
From: Frederic Weisbecker @ 2009-05-20  2:34 UTC (permalink / raw)
  To: Russell King - ARM Linux
  Cc: Tim Bird, Ingo Molnar, linux kernel, linux-arm-kernel,
	Steven Rostedt, Uwe Kleine-König

On Fri, May 15, 2009 at 10:06:36PM +0100, Russell King - ARM Linux wrote:
> On Sat, May 09, 2009 at 06:14:32PM +0200, Frédéric Weisbecker wrote:
> > Ingo, Russell.
> > What do you think about this?
> 
> If it's suitable for the next merge window, lets get it queued up for
> it.    What are the dependencies for the patch?  Does it rely on
> anything queued in anyone elses tree (eg, the addition of
> ftrace_return_to_handler) ?



No, until now since -rc1 we hadn't any modifications on the function
graph tracer that affects arch code.
It should be fine with upstream tracing code.


 
> However, I'm not sure that this code is entirely right (and I'm not
> sure what's going on with this patch - my editor is randomly changing
> the placement of characters in it.  Are you submitting patches using
> UTF-8 characters in the code?)
> 
> > >> @@ -139,8 +144,16 @@ ENTRY(mcount)
> > >>       adr r0, ftrace_stub
> > >>       cmp r0, r2
> > >>       bne trace
> 
> If this is r0 != ftrace_stub, go to trace.  So the next block will
> only be executed if r0 /was/ ftrace_stub, in which case it can't be
> ftrace_graph_return.



Ah! This part concerns the function tracer.
Let's see how it looks like in the original code: (added more comments inside)


ENTRY(mcount)
	stmdb sp!, {r0-r3, lr}
	@ ftrace_trace_function points to the function tracer handler
	ldr r0, =ftrace_trace_function
	ldr r2, [r0]
	adr r0, ftrace_stub

@- check if the function tracer is running: ftrace_trace_function != ftrace_stub

	cmp r0, r2

@ if so, go to trace where we jump to the handler (mov pc, r2 in trace:)

	bne trace


	ldr lr, [fp, #-4]			@ restore lr
	ldmia sp!, {r0-r3, pc}

trace:
	ldr r1, [fp, #-4]			@ lr of instrumented routine
	mov r0, lr
	sub r0, r0, #MCOUNT_INSN_SIZE
	mov lr, pc
	mov pc, r2
	mov lr, r1				@ restore lr
	ldmia sp!, {r0-r3, pc}


See? trace actually only handles the function tracer, not the function graph tracer.

Now that we have the function graph tracer, the logic remains the same,
with a small difference:

- check if function tracer running (ftrace_trace_function != ftrace_stub)
- if so, then jump to trace
- otherwise, check if function graph tracer is running (ftrace_graph_return != ftrace_stub)
- if so, then jump to ftrace_graph_caller
- otherwise return

Hm?

Frederic.

> > >> +
> > >> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> > >> +     ldr r1, =ftrace_graph_return
> > >> +     ldr r2, [r1]
> > >> +     cmp r0, r2              @ if *ftrace_graph_return != ftrace_stub
> > >> +     bne ftrace_graph_caller
> > >> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> > >> +
> > >>       ldr lr, [fp, #-4]                       @ restore lr
> > >> -     ldmia sp!, {r0-r3, pc}
> > >> +     ldmia sp!, {r0-r3, pc}                  @ return doing nothing
> > >>
> > >>  trace:
> 
> So surely you want your code above placed here?
> 
> > >>       ldr r1, [fp, #-4]                       @ lr of instrumented routine
> > >> @@ -151,6 +164,25 @@ trace:
> > >>       mov lr, r1                              @ restore lr
> > >>       ldmia sp!, {r0-r3, pc}
> > >>
> > >> +#ifdef CONFIG_FUNCTION_GRAPH_TRACER
> > >> +ENTRY(ftrace_graph_caller)
> > >> +     sub r0, fp, #4                  @ &lr of instrumented routine (&parent)
> > >> +     mov r1, lr                      @ instrumented routine (func)
> > >> +     sub r1, r1, #MCOUNT_INSN_SIZE
> > >> +     bl prepare_ftrace_return
> > >> +     ldr lr, [fp, #-4]               @ restore lr
> > >> +     ldmia sp!, {r0-r3, pc}
> > >> +
> > >> +     .globl return_to_handler
> > >> +return_to_handler:
> > >> +     stmdb sp!, {r0-r3}
> > >> +     bl ftrace_return_to_handler
> > >> +     mov lr, r0                      @ r0 has real ret addr
> > >> +     ldmia sp!, {r0-r3}
> > >> +     mov pc, lr
> > >> +
> > >> +#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
> > >
> > >
> > >
> > > Looks good.
> > >
> > >
> > >
> > >>  #endif /* CONFIG_DYNAMIC_FTRACE */
> > >>
> > >>       .globl ftrace_stub
> > >> --- /dev/null
> > >> +++ b/arch/arm/kernel/ftrace_return.c
> > >
> > >
> > >
> > > Because it is more commonly known as function graph,
> > > I would suggest ftrace_graph.c so that people can
> > > find it more easily.
> > >
> > >
> > >
> > >> @@ -0,0 +1,44 @@
> > >> +/*
> > >> + * function return tracing support.
> > >> + *
> > >> + * Copyright (C) 2009 Tim Bird <tim.bird@am.sony.com>
> > >> + *
> > >> + * For licencing details, see COPYING.
> > >> + *
> > >> + * Defines routine needed for ARM return trampoline for tracing
> > >> + * function exits.
> > >> + */
> > >> +
> > >> +#include <linux/ftrace.h>
> > >> +
> > >> +/*
> > >> + * Hook the return address and push it in the stack of return addrs
> > >> + * in current thread info.
> > >> + */
> > >> +void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
> > >> +{
> > >> +     unsigned long old;
> > >> +
> > >> +     struct ftrace_graph_ent trace;
> > >> +     unsigned long return_hooker = (unsigned long)
> > >> +                             &return_to_handler;
> > >> +
> > >> +     if (unlikely(atomic_read(&current->tracing_graph_pause)))
> > >> +             return;
> > >> +
> > >> +     old = *parent;
> > >> +     *parent = return_hooker;
> > >> +
> > >> +     if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) {
> > >> +             *parent = old;
> > >> +             return;
> > >> +     }
> > >> +
> > >> +     trace.func = self_addr;
> > >> +
> > >> +     /* Only trace if the calling function expects to */
> > >> +     if (!ftrace_graph_entry(&trace)) {
> > >> +             current->curr_ret_stack--;
> > >> +             *parent = old;
> > >> +     }
> > >> +}
> > >> --- a/arch/arm/kernel/vmlinux.lds.S
> > >> +++ b/arch/arm/kernel/vmlinux.lds.S
> > >> @@ -99,6 +99,7 @@ SECTIONS
> > >>                       SCHED_TEXT
> > >>                       LOCK_TEXT
> > >>                       KPROBES_TEXT
> > >> +                     IRQENTRY_TEXT
> > >>  #ifdef CONFIG_MMU
> > >>                       *(.fixup)
> > >>  #endif
> > >
> > >
> > > Well, it looks good to me.
> > > May be you can also add the fault protection against the return address,
> > > as a paranoid check. But that can be done later.
> > >
> > > Also I wonder how far we are from the dynamic ftrace support, which seems
> > > half implemented or broken or not tested for a while?
> > >
> > > Thanks!
> > >
> > > Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
> > >
> > 
> > -------------------------------------------------------------------
> > List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
> > FAQ:        http://www.arm.linux.org.uk/mailinglists/faq.php
> > Etiquette:  http://www.arm.linux.org.uk/mailinglists/etiquette.php


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2
  2009-05-20  2:34       ` Frederic Weisbecker
@ 2009-05-20  8:11         ` Russell King - ARM Linux
  0 siblings, 0 replies; 8+ messages in thread
From: Russell King - ARM Linux @ 2009-05-20  8:11 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: Tim Bird, Ingo Molnar, linux kernel, linux-arm-kernel,
	Steven Rostedt, Uwe Kleine-König

On Wed, May 20, 2009 at 04:34:35AM +0200, Frederic Weisbecker wrote:
> On Fri, May 15, 2009 at 10:06:36PM +0100, Russell King - ARM Linux wrote:
> > However, I'm not sure that this code is entirely right (and I'm not
> > sure what's going on with this patch - my editor is randomly changing
> > the placement of characters in it.  Are you submitting patches using
> > UTF-8 characters in the code?)
> > 
> > > >> @@ -139,8 +144,16 @@ ENTRY(mcount)
> > > >>       adr r0, ftrace_stub
> > > >>       cmp r0, r2
> > > >>       bne trace
> > 
> > If this is r0 != ftrace_stub, go to trace.  So the next block will
> > only be executed if r0 /was/ ftrace_stub, in which case it can't be
> > ftrace_graph_return.
> 
> Ah! This part concerns the function tracer.
> Let's see how it looks like in the original code: (added more comments
> inside)

You've completely missed the point I was trying to make.  Please go back
and re-read my email and think about precisely what's happening in the
assembly path, particularly which branches will be taken and which code
paths will be taken with various values of r2.


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-05-20  8:12 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-01 22:38 [PATCH 2/2] ftrace: add function-graph tracer support for ARM v2 Tim Bird
2009-05-02  0:11 ` Frederic Weisbecker
2009-05-02 15:15   ` Uwe Kleine-König
2009-05-02 19:21     ` Steven Rostedt
2009-05-09 16:14   ` Frédéric Weisbecker
2009-05-15 21:06     ` Russell King - ARM Linux
2009-05-20  2:34       ` Frederic Weisbecker
2009-05-20  8:11         ` Russell King - ARM Linux

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox