powerpc: dynamic ftrace port
Steven Rostedt
maintainercover powerpc: dynamic ftrace port
Paul and Ingo,
The following are the changes to get dynamic ftrace working on PowerPC. I modified these a little from the last postings.
1) I removed the changes to recordmcount.pl. This is not a PowerPC change, although PowerPC needs it for dynamic ftrace. But the changes here can go via linux-tip.
2) I removed the adding of HAVE_DYNAMIC_FTRACE and HAVE_FTRACE_MCOUNT_RECORD. Without these config options, this code will not be compiled. I have a separate patch that adds them in when the time is right.
Paul, these patches should not harm anything if you decide to pull them in. As I stated above, without the above config options, they are not enabled.
There is one exception and that is for the first patch. The first patch is actually a fix for the irqsoff latency tracer which is already in mainline for PowerPC.
These patches only touch PowerPC code.
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
branch: ppc/ftrace
Steven Rostedt (5):
powerpc: ftrace, do not latency trace idle
powerpc: ftrace, convert to new dynamic ftrace arch API
powerpc: ftrace, use probe_kernel API to modify code powerpc/ppc64: ftrace, handle module trampolines for dyn ftrace powerpc/ppc32: ftrace, dynamic ftrace to handle modules
----
arch/powerpc/include/asm/ftrace.h | 14 +- arch/powerpc/include/asm/module.h | 16 ++- arch/powerpc/kernel/ftrace.c | 473 +++++++++++++++++++++++++++++++++--- arch/powerpc/kernel/idle.c | 5 + arch/powerpc/kernel/module_32.c | 10 + arch/powerpc/kernel/module_64.c | 13 + 6 files changed, 489 insertions(+), 42 deletions(-)
Steven Rostedt
maintainerPATCH 1/5 powerpc: ftrace, do not latency trace idle
From: Steven Rostedt <[email protected]>
Impact: fix for irq off latency tracer
When idle is called, interrupts are disabled, but the idle function will still wake up on an interrupt. The problem is that the interrupt disabled latency tracer will take this call to idle as a latency.
This patch disables the latency tracing when going into idle.
--- arch/powerpc/kernel/idle.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
arch/powerpc/kernel/idle.c +5 -0
@@ -69,10 +69,15 @@ void cpu_idle(void)smp_mb ();local_irq_disable (); +/* Don't trace irqs off for idle */ +stop_critical_timings (); +/* check again after disabling irqs */ if (!need_resched () && !cpu_should_die ()) ppc_md.power_save (); +start_critical_timings (); +local_irq_enable ();set_thread_flag (TIF_POLLING_NRFLAG );
Signature · 3 lines
1.5.6.5 --
Steven Rostedt
maintainerPATCH 2/5 powerpc: ftrace, convert to new dynamic ftrace arch API
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Impact: update to PowerPC ftrace arch API
This patch converts PowerPC to use the new dynamic ftrace arch API.
Thanks to Paul Mackennas for pointing out the mistakes of my original test_24bit_addr function.
--- arch/powerpc/include/asm/ftrace.h | 14 +++++++- arch/powerpc/kernel/ftrace.c | 67 ++++++++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 6 deletions(-)
arch/powerpc/include/asm/ftrace.h +13 -1
@@ -7,7 +7,19 @@#ifndef __ASSEMBLY__extern void _mcount (void ); -#endif + +#ifdef CONFIG_DYNAMIC_FTRACE +static inline unsigned long ftrace_call_adjust (unsigned long addr) +{ +/* reloction of mcount call site is the same as the address */ +return addr; +} + +struct dyn_arch_ftrace { +/* nothing yet */ +}; +#endif /* CONFIG_DYNAMIC_FTRACE */ +#endif /* __ASSEMBLY__ */ #endif
arch/powerpc/kernel/ftrace.c +62 -5
96 lines not on this page · raw message
Signature · 3 lines
1.5.6.5 --
Re: [PATCH 2/5] powerpc: ftrace, convert to new dynamic ftrace arch API
Quoted 1 line · Steven Rostedt
Thanks to Paul Mackennas for pointing out the mistakes of my original
Mackerras
Quoted 5 lines
arch/powerpc/kernel/ftrace.c +5
-0+static int test_24bit_addr (unsigned long ip,unsigned long addr) +{ +long diff; + +/*
arch/powerpc/kernel/ftrace.c ftrace_modify_code(unsigned long ip, unsigned char *old_code, · line 130
Quoted 10 lines
arch/powerpc/kernel/ftrace.c +10
-0+* Can we get to addr from ip in 24 bits? +* (26 really, since we mulitply by 4 for 4 byte alignment) +*/ + diff = addr - ip; + +/* +* Return true if diff is less than 1 << 25 +* and greater than -1 << 26. +*/ +return (diff < (1 <<25 )) && (diff > (-1 <<26 ));
I think this still isn't right, and the comment is one of those ones that is only useful to people who can't read C, as it's just a transliteration of the code.
The comment should say something like "Return true if diff can be represented as a 26-bit twos-complement binary number" and the second part of the test should be (diff >= (-1 << 25)). However, since you define a test_offset() function in patch 4/5 that does the same test but using only one comparison instead of two, why don't you just say:
return !test_offset(diff);
(having first moved test_offset() before test_24bit_addr)?
Paul.
Re: [PATCH 2/5] powerpc: ftrace, convert to new dynamic ftrace arch API
Quoted 32 lines · Paul Mackerras
Quoted 1 line · Steven Rostedt
Thanks to Paul Mackennas for pointing out the mistakes of my original
Mackerras
Quoted 5 lines
arch/powerpc/kernel/ftrace.c +5
-0+static int test_24bit_addr (unsigned long ip,unsigned long addr) +{ +long diff; + +/* arch/powerpc/kernel/ftrace.c ftrace_modify_code(unsigned long ip, unsigned char *old_code, · line 130
Quoted 10 lines
arch/powerpc/kernel/ftrace.c +10
-0+* Can we get to addr from ip in 24 bits? +* (26 really, since we mulitply by 4 for 4 byte alignment) +*/ + diff = addr - ip; + +/* +* Return true if diff is less than 1 << 25 +* and greater than -1 << 26. +*/ +return (diff < (1 <<25 )) && (diff > (-1 <<26 ));I think this still isn't right, and the comment is one of those ones that is only useful to people who can't read C, as it's just a transliteration of the code.
The comment should say something like "Return true if diff can be represented as a 26-bit twos-complement binary number" and the second part of the test should be (diff >= (-1 << 25)). However, since you define a
test_offset()function in patch 4/5 that does the same test but using only one comparison instead of two, why don't you just say:
Quoted 3 lines
return !test_offset(diff);(having first moved
test_offset()beforetest_24bit_addr)?
Or better still, split out and use the code from create_branch() in arch/powerpc/lib/code-patching.c .. which is hopefully correct :)
cheers
Signature · 8 lines
Michael Ellerman OzLabs, IBM Australia Development Lab wwweb: http://michael.ellerman.id.au phone: +61 2 6212 1183 (tie line 70 21183) We do not inherit the earth from our ancestors, we borrow it from our children. - S.M.A.R.T Person
Steven Rostedt
maintainerRe: [PATCH 2/5] powerpc: ftrace, convert to new dynamic ftrace arch API
In reply to Paul MackerrasQuoted 5 lines · Paul Mackerras
Quoted 1 line · Steven Rostedt
Thanks to Paul Mackennas for pointing out the mistakes of my original
Mackerras
Heh, I have two reasons for that typo.
1) I reference Paul McKenney a lot, and my fingers are programmed.
2) I type with the dvorak layout, and the 'r' is just above the 'n'.
qwerty 'o' == dvorak 'r'
qwerty 'l' == dvorak 'n';-)
Quoted 12 lines
Quoted 12 lines
arch/powerpc/kernel/ftrace.c +11
-0+static int test_24bit_addr (unsigned long ip,unsigned long addr) +{ +long diff; + +/* +* Can we get to addr from ip in 24 bits? +* (26 really, since we mulitply by 4 for 4 byte alignment) +*/ + diff = addr - ip; + +/*
Quoted 8 lines
arch/powerpc/kernel/ftrace.c ftrace_modify_code(unsigned long ip, unsigned char *old_code, · line 130
Quoted 4 lines
arch/powerpc/kernel/ftrace.c +4
-0+* Return true if diff is less than 1 << 25 +* and greater than -1 << 26. +*/ +return (diff < (1 <<25 )) && (diff > (-1 <<26 ));I think this still isn't right, and the comment is one of those ones that is only useful to people who can't read C, as it's just a transliteration of the code.
Argh!!! That must be a misfold. I fixed that code. The final version ad the same shift for both.
Quoted 10 lines
The comment should say something like "Return true if diff can be represented as a 26-bit twos-complement binary number" and the second part of the test should be (diff >= (-1 << 25)). However, since you define a
test_offset()function in patch 4/5 that does the same test but using only one comparison instead of two, why don't you just say:return !test_offset(diff);(having first moved
test_offset()beforetest_24bit_addr)?
OK, will fix. Thanks. Hmm, maybe I ment to do that, and miss the patch :-/
-- Steve
Steven Rostedt
maintainerPATCH 3/5 powerpc: ftrace, use probe_kernel API to modify code
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Impact: use cleaner probe_kernel API over assembly
Using probe_kernel_read/write interface is a much cleaner approach than the current assembly version.
--- arch/powerpc/kernel/ftrace.c | 53 ++++++++++++++++------------------------- 1 files changed, 21 insertions(+), 32 deletions(-)
arch/powerpc/kernel/ftrace.c +21 -32
@@ -9,6 +9,7 @@#include <linux/spinlock.h> #include <linux/hardirq.h> +#include <linux/uaccess.h> #include <linux/ftrace.h> #include <linux/percpu.h> #include <linux/init.h>
@@ -72,45 +73,33 @@ static int ftrace_modify_code(unsigned long ip, unsigned char *old_code, unsigned char *new_code) { - unsigned replaced; -unsigned old = *(unsigned *)old_code; -unsigned new = *(unsigned *)new_code; -int faulted =0 ; + unsigned char replaced[MCOUNT_INSN_SIZE];/* * Note: Due to modules and __init, code can * disappear and change, we need to protect against faulting -* as well as code changing. +* as well as code changing. We do this by using the +* probe_kernel_* functions. * * No real locking needed, this code is run through -* kstop_machine. +* kstop_machine, or before SMP starts. */ - asmvolatile ( -"1: lwz %1, 0(%2)\n" -" cmpw %1, %5\n" -" bne 2f\n" -" stwu %3, 0(%2)\n" -"2:\n" -".section .fixup, \"ax\"\n" -"3: li %0, 1\n" -" b 2b\n" -".previous\n" -".section __ex_table,\"a\"\n" - _ASM_ALIGN"\n" - _ASM_PTR"1b, 3b\n" -".previous" - :"=r" (faulted),"=r" (replaced) - :"r" (ip),"r" (new), -"0" (faulted),"r" (old) - :"memory" ); - -if (replaced != old && replaced != new) - faulted =2 ; - -if (!faulted) -flush_icache_range (ip, ip +8 ); - -return faulted; + +/* read the text we want to modify */ +if (probe_kernel_read (replaced, (void *)ip,MCOUNT_INSN_SIZE )) +return -EFAULT ; + +/* Make sure it is what we expect it to be */ +if (memcmp (replaced, old_code,MCOUNT_INSN_SIZE ) !=0 ) +return -EINVAL ; + +/* replace the text with the new text */ +if (probe_kernel_write ((void *)ip, new_code,MCOUNT_INSN_SIZE )) +return -EPERM ; + +flush_icache_range (ip, ip +8 ); + +return 0 ; }static int test_24bit_addr (unsigned long ip,unsigned long addr)
Signature · 3 lines
1.5.6.5 --
Steven Rostedt
maintainerPATCH 4/5 powerpc/ppc64: ftrace, handle module trampolines for dyn ftrace
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Impact: Allow 64 bit PowerPC to trace modules with dynamic ftrace
This adds code to handle the PPC64 module trampolines, and allows for PPC64 to use dynamic ftrace.
Thanks to Paul Mackerras for these updates:
- fix the mod and rec->arch.mod NULL checks.
- fix to is_bl_op compare.
Thanks to Milton Miller for:
- finding the nasty race with using two nops, and recommending instead that I use a branch 8 forward.
--- arch/powerpc/include/asm/ftrace.h | 2 +- arch/powerpc/include/asm/module.h | 11 ++ arch/powerpc/kernel/ftrace.c | 278 +++++++++++++++++++++++++++++++++++-- arch/powerpc/kernel/module_64.c | 13 ++ 4 files changed, 293 insertions(+), 11 deletions(-)
arch/powerpc/include/asm/ftrace.h +1 -1
@@ -16,7 +16,7 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) }struct dyn_arch_ftrace { -/* nothing yet */ +struct module *mod; };#endif /* CONFIG_DYNAMIC_FTRACE */ #endif /* __ASSEMBLY__ */
arch/powerpc/include/asm/module.h +11 -0
@@ -34,6 +34,11 @@ struct mod_arch_specific {#ifdef __powerpc64__unsigned int stubs_section;/* Index of stubs section in module */ unsigned int toc_section;/* What section is the TOC? */ +#ifdef CONFIG_DYNAMIC_FTRACE +unsigned long toc; +unsigned long tramp; +#endif +#else /* Indices of PLT sections within module. */ unsigned int core_plt_section;
@@ -68,6 +73,12 @@ struct mod_arch_specific {# endif /* MODULE */ #endif +#ifdef CONFIG_DYNAMIC_FTRACE +# ifdef MODULE + asm(".section .ftrace.tramp,\"ax\",@nobits; .align 3; .previous" ); +# endif /* MODULE */ +#endif +struct exception_table_entry ; void sort_ex_table(struct exception_table_entry *start,
arch/powerpc/kernel/ftrace.c +268 -10
343 lines not on this page · raw message
arch/powerpc/kernel/module_64.c +13 -0
@@ -20,6 +20,7 @@#include <linux/moduleloader.h> #include <linux/err.h> #include <linux/vmalloc.h> +#include <linux/ftrace.h> #include <linux/bug.h> #include <asm/module.h> #include <asm/firmware.h>
@@ -163,6 +164,11 @@ static unsigned long get_stubs_size(const Elf64_Ehdr *hdr, } } +#ifdef CONFIG_DYNAMIC_FTRACE +/* make the trampoline to the ftrace_caller */ + relocs++; +#endif +DEBUGP ("Looks like a total of %lu stubs, max\n" , relocs);return relocs *sizeof (struct ppc64_stub_entry ); }
@@ -441,5 +447,12 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, } } +#ifdef CONFIG_DYNAMIC_FTRACE + me->arch.toc =my_r2 (sechdrs, me); + me->arch.tramp =stub_for_addr (sechdrs, + (unsigned long )ftrace_caller, + me); +#endif +return 0 ; }
Signature · 3 lines
1.5.6.5 --
Re: [PATCH 4/5] powerpc/ppc64: ftrace, handle module trampolines for dyn ftrace
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 166
Quoted 7 lines · Steven Rostedt
arch/powerpc/kernel/ftrace.c +7
-0+#ifdef CONFIG_PPC64 +static int +__ftrace_make_nop (struct module *mod, +struct dyn_ftrace *rec,unsigned long addr) +{ +unsigned char replaced[MCOUNT_INSN_SIZE *2 ]; +unsigned int *op = (unsigned *)&replaced;
This makes me a little nervous, since it looks to me to be breaking aliasing rules. I know we use -fno-strict-aliasing, but still it would be better to avoid doing these casts if possible - and we should be able to avoid most of them by using unsigned int for instructions consistently, instead of a mix of unsigned int and unsigned char.
Quoted 6 lines
arch/powerpc/kernel/ftrace.c +6
-0+DEBUGP ("ip:%lx jumps to %lx r2: %lx" , ip, tramp, mod->arch.toc); + +/* Find where the trampoline jumps to */ +if (probe_kernel_read (jmp, (void *)tramp,8 )) { +printk (KERN_ERR "Failed to read %lx\n" , tramp); +return -EFAULT ;
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 215
Quoted 10 lines
arch/powerpc/kernel/ftrace.c +10
-0+ } + +DEBUGP (" %08x %08x" , + (unsigned )(*ptr >>32 ), + (unsigned )*ptr); + + offset = (unsigned )jmp[2 ] <<24 | + (unsigned )jmp[3 ] <<16 | + (unsigned )jmp[6 ] <<8 | + (unsigned )jmp[7 ];
We don't seem to be checking that these instructions look like the start of a trampoline created by module_64.c, which makes me a little nervous.
If the kernel text goes over 32MB, the linker will insert trampolines automatically. Those trampolines either look like a direct branch to the target, or else they look like this:
addis r12,r2,xxxx ld r11,yyyy(r12) mtctr r11 bctr
where xxxx/yyyy gives the offset from the kernel TOC to the procedure descriptor for the target.
Now, a kernel with > 32MB of text probably won't work for other reasons at the moment (like the linker putting trampolines before the interrupt vectors), so in a sense it doesn't matter. It also doesn't matter since we only get here for calls in modules (something that could stand to be mentioned in a comment at the top of the function). Nevertheless, I think it would be worthwhile to check that the first two instructions look like the addis and addi that we are expecting.
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 270
Quoted 5 lines
arch/powerpc/kernel/ftrace.c +5
-0+if (probe_kernel_write ((void *)ip, replaced,MCOUNT_INSN_SIZE )) +return -EPERM ; + +return 0 ; +}
We don't seem to do anything to ensure I-cache consistency. I think we probably need a flush_icache_range call here. Similarly in __ftrace_make_call.
Paul.
Steven Rostedt
maintainerRe: [PATCH 4/5] powerpc/ppc64: ftrace, handle module trampolines for dyn ftrace
Quoted 15 lines · Paul Mackerras
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 166
Quoted 7 lines · Steven Rostedt
arch/powerpc/kernel/ftrace.c +7
-0+#ifdef CONFIG_PPC64 +static int +__ftrace_make_nop (struct module *mod, +struct dyn_ftrace *rec,unsigned long addr) +{ +unsigned char replaced[MCOUNT_INSN_SIZE *2 ]; +unsigned int *op = (unsigned *)&replaced;This makes me a little nervous, since it looks to me to be breaking aliasing rules. I know we use -fno-strict-aliasing, but still it would be better to avoid doing these casts if possible - and we should be able to avoid most of them by using unsigned int for instructions consistently, instead of a mix of unsigned int and unsigned char.
OK, I'll update this. We did a cleanup of all archs to use a char[MCOUNT_INSN_SIZE] array, and I've just been keeping it.
Quoted 13 lines
Quoted 13 lines
arch/powerpc/kernel/ftrace.c +12
-0+DEBUGP ("ip:%lx jumps to %lx r2: %lx" , ip, tramp, mod->arch.toc); + +/* Find where the trampoline jumps to */ +if (probe_kernel_read (jmp, (void *)tramp,8 )) { +printk (KERN_ERR "Failed to read %lx\n" , tramp); +return -EFAULT ; + } + +DEBUGP (" %08x %08x" , + (unsigned )(*ptr >>32 ), + (unsigned )*ptr); +
Quoted 8 lines
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 215
Quoted 4 lines
arch/powerpc/kernel/ftrace.c +4
-0+ offset = (unsigned )jmp[2 ] <<24 | + (unsigned )jmp[3 ] <<16 | + (unsigned )jmp[6 ] <<8 | + (unsigned )jmp[7 ];We don't seem to be checking that these instructions look like the start of a trampoline created by
module_64.c, which makes me a little nervous.
I'll add this check.
Quoted 13 lines
If the kernel text goes over 32MB, the linker will insert trampolines automatically. Those trampolines either look like a direct branch to the target, or else they look like this:
addis r12,r2,xxxx ld r11,yyyy(r12) mtctr r11 bctrwhere xxxx/yyyy gives the offset from the kernel TOC to the procedure descriptor for the target.
Quoted 7 lines
Now, a kernel with > 32MB of text probably won't work for other reasons at the moment (like the linker putting trampolines before the interrupt vectors), so in a sense it doesn't matter. It also doesn't matter since we only get here for calls in modules (something that could stand to be mentioned in a comment at the top of the function). Nevertheless, I think it would be worthwhile to check that the first two instructions look like the addis and addi that we are expecting.
I'll add the "module only" comment. If the linker ever decided to add more trampolines to the core kernel, then ftrace would detect that and print a warning and disable itself.
Quoted 10 lines
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 270
Quoted 6 lines
arch/powerpc/kernel/ftrace.c +5
-0+if (probe_kernel_write ((void *)ip, replaced,MCOUNT_INSN_SIZE )) +return -EPERM ; + +return 0 ; +}We don't seem to do anything to ensure I-cache consistency. I think we probably need a
flush_icache_rangecall here. Similarly in__ftrace_make_call.
Crap! you are right. I forgot to do that. Will fix.
Thanks,
-- Steve
Steven Rostedt
maintainerRe: [PATCH 4/5] powerpc/ppc64: ftrace, handle module trampolines for dyn ftrace
In reply to Paul MackerrasPaul and Ingo,
Would it be best for me to just refold these changes into the original patch series, and update the git repo? Or should I apply these changes on top of this series?
Thanks,
-- Steve
Quoted 70 lines · Paul Mackerras
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 166
Quoted 7 lines · Steven Rostedt
arch/powerpc/kernel/ftrace.c +7
-0+#ifdef CONFIG_PPC64 +static int +__ftrace_make_nop (struct module *mod, +struct dyn_ftrace *rec,unsigned long addr) +{ +unsigned char replaced[MCOUNT_INSN_SIZE *2 ]; +unsigned int *op = (unsigned *)&replaced;This makes me a little nervous, since it looks to me to be breaking aliasing rules. I know we use -fno-strict-aliasing, but still it would be better to avoid doing these casts if possible - and we should be able to avoid most of them by using unsigned int for instructions consistently, instead of a mix of unsigned int and unsigned char.
Quoted 6 lines
arch/powerpc/kernel/ftrace.c +6
-0+DEBUGP ("ip:%lx jumps to %lx r2: %lx" , ip, tramp, mod->arch.toc); + +/* Find where the trampoline jumps to */ +if (probe_kernel_read (jmp, (void *)tramp,8 )) { +printk (KERN_ERR "Failed to read %lx\n" , tramp); +return -EFAULT ;arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 215
Quoted 10 lines
arch/powerpc/kernel/ftrace.c +10
-0+ } + +DEBUGP (" %08x %08x" , + (unsigned )(*ptr >>32 ), + (unsigned )*ptr); + + offset = (unsigned )jmp[2 ] <<24 | + (unsigned )jmp[3 ] <<16 | + (unsigned )jmp[6 ] <<8 | + (unsigned )jmp[7 ];We don't seem to be checking that these instructions look like the start of a trampoline created by
module_64.c, which makes me a little nervous.If the kernel text goes over 32MB, the linker will insert trampolines automatically. Those trampolines either look like a direct branch to the target, or else they look like this:
addis r12,r2,xxxx ld r11,yyyy(r12) mtctr r11 bctrwhere xxxx/yyyy gives the offset from the kernel TOC to the procedure descriptor for the target.
Now, a kernel with > 32MB of text probably won't work for other reasons at the moment (like the linker putting trampolines before the interrupt vectors), so in a sense it doesn't matter. It also doesn't matter since we only get here for calls in modules (something that could stand to be mentioned in a comment at the top of the function). Nevertheless, I think it would be worthwhile to check that the first two instructions look like the addis and addi that we are expecting.
arch/powerpc/kernel/ftrace.c static int test_24bit_addr(unsigned long ip, unsigned long addr) · line 270
Quoted 5 lines
arch/powerpc/kernel/ftrace.c +5
-0+if (probe_kernel_write ((void *)ip, replaced,MCOUNT_INSN_SIZE )) +return -EPERM ; + +return 0 ; +}We don't seem to do anything to ensure I-cache consistency. I think we probably need a
flush_icache_rangecall here. Similarly in__ftrace_make_call.Paul.
Steven Rostedt
maintainerPATCH 5/5 powerpc/ppc32: ftrace, dynamic ftrace to handle modules
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Impact: add ability to trace modules on 32 bit PowerPC
This patch performs the necessary trampoline calls to handle modules with dynamic ftrace on 32 bit PowerPC.
--- arch/powerpc/include/asm/module.h | 5 ++- arch/powerpc/kernel/ftrace.c | 101 ++++++++++++++++++++++++++++++++++-- arch/powerpc/kernel/module_32.c | 10 ++++ 3 files changed, 109 insertions(+), 7 deletions(-)
arch/powerpc/include/asm/module.h +4 -1
@@ -39,11 +39,14 @@ struct mod_arch_specific {unsigned long tramp;#endif -#else +#else /* powerpc64 */ /* Indices of PLT sections within module. */ unsigned int core_plt_section;unsigned int init_plt_section; +#ifdef CONFIG_DYNAMIC_FTRACE +unsigned long tramp;#endif +#endif /* powerpc64 */ /* List of BUG addresses, source line numbers and filenames */ struct list_head bug_list;
arch/powerpc/kernel/ftrace.c +95 -6
137 lines not on this page · raw message
arch/powerpc/kernel/module_32.c +10 -0
@@ -22,6 +22,7 @@#include <linux/fs.h> #include <linux/string.h> #include <linux/kernel.h> +#include <linux/ftrace.h> #include <linux/cache.h> #include <linux/bug.h> #include <linux/sort.h>
@@ -53,6 +54,9 @@ static unsigned int count_relocs(const Elf32_Rela *rela, unsigned int num) r_addend = rela[i].r_addend; } +#ifdef CONFIG_DYNAMIC_FTRACE + _count_relocs++;/* add one for ftrace_caller */ +#endif return _count_relocs; }
@@ -306,5 +310,11 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,return -ENOEXEC ; } } +#ifdef CONFIG_DYNAMIC_FTRACE + module->arch.tramp = +do_plt_call (module->module_core, + (unsigned long )ftrace_caller, + sechdrs, module); +#endif return 0 ; }
Signature · 3 lines
1.5.6.5 --
Re: [PATCH 5/5] powerpc/ppc32: ftrace, dynamic ftrace to handle modules
Quoted 2 lines · Steven Rostedt
This patch performs the necessary trampoline calls to handle modules with dynamic ftrace on 32 bit PowerPC.
Looks OK except for the need to call flush_icache_range after probe_kernel_write, like in the 64-bit case.
Paul.
Steven Rostedt
maintainerQuoted 4 lines · Steven Rostedt
1) I removed the changes to recordmcount.pl. This is not a PowerPC change, although PowerPC needs it for dynamic ftrace. But the changes here can go via linux-tip.
Ingo,
I found that the recordmcount.pl change conflicts with a commit in linux-next, which is not in tip nor mainline. The commit is:
11ebca4a3f8337de2f4d1300bd307851d1191d53
sh: dynamic ftrace support.
Seems that this change came in through the sh repo. I have already resolved the conflicts with my updates for PowerPC with this commit. I can put this in a separate branch against linux-next if you like.
I would like to get the changes to recordmcount.pl for PowerPC in linux-next soon, so I can also add a small clean up of this code. Jim Radfort has some updates as well for his port to arm.
-- Steve
Quoted 14 lines · Steven Rostedt
Quoted 4 lines · Steven Rostedt
1) I removed the changes to recordmcount.pl. This is not a PowerPC change, although PowerPC needs it for dynamic ftrace. But the changes here can go via linux-tip.
Ingo,
I found that the recordmcount.pl change conflicts with a commit in linux-next, which is not in tip nor mainline. The commit is:
11ebca4a3f8337de2f4d1300bd307851d1191d53
sh: dynamic ftrace support.
Quoted 7 lines
Seems that this change came in through the sh repo. I have already resolved the conflicts with my updates for PowerPC with this commit. I can put this in a separate branch against linux-next if you like.
I would like to get the changes to recordmcount.pl for PowerPC in linux-next soon, so I can also add a small clean up of this code. Jim Radfort has some updates as well for his port to arm.
Could you please extract the sh bits from 11ebca4a so that we can apply it to tip/tracing/* standalone? It makes sense to carry it without having the other bits of the SH changes.
It will collide in linux-next but it will be a same-content collision with an easy enough (perhaps even automatic) resolution.
Ingo
Quoted 37 lines · Steven Rostedt
Paul and Ingo,
The following are the changes to get dynamic ftrace working on PowerPC. I modified these a little from the last postings.
1) I removed the changes to recordmcount.pl. This is not a PowerPC change, although PowerPC needs it for dynamic ftrace. But the changes here can go via linux-tip.
2) I removed the adding of
HAVE_DYNAMIC_FTRACEandHAVE_FTRACE_MCOUNT_RECORD. Without these config options, this code will not be compiled. I have a separate patch that adds them in when the time is right.Paul, these patches should not harm anything if you decide to pull them in. As I stated above, without the above config options, they are not enabled.
There is one exception and that is for the first patch. The first patch is actually a fix for the irqsoff latency tracer which is already in mainline for PowerPC.
These patches only touch PowerPC code.
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.gitbranch: ppc/ftrace
Steven Rostedt (5):
powerpc: ftrace, do not latency trace idle
powerpc: ftrace, convert to new dynamic ftrace arch API
powerpc: ftrace, useprobe_kernelAPI to modify code powerpc/ppc64: ftrace, handle module trampolines for dyn ftrace powerpc/ppc32: ftrace, dynamic ftrace to handle modules
Quoted 8 lines
----
arch/powerpc/include/asm/ftrace.h | 14 +- arch/powerpc/include/asm/module.h | 16 ++- arch/powerpc/kernel/ftrace.c | 473 +++++++++++++++++++++++++++++++++--- arch/powerpc/kernel/idle.c | 5 + arch/powerpc/kernel/module_32.c | 10 + arch/powerpc/kernel/module_64.c | 13 + 6 files changed, 489 insertions(+), 42 deletions(-)
looks perfect to me! Thanks Steve for going through this - this was really a logistical worst-case-scenario.
Now lets hope it looks good to Paul too and we can get his Acked-by :-)
Ingo
Steven Rostedt
maintainerQuoted 6 lines · Ingo Molnar
Quoted 5 lines
There is one exception and that is for the first patch. The first patch is actually a fix for the irqsoff latency tracer which is already in mainline for PowerPC.
Quoted 7 lines
Quoted 2 lines
Steven Rostedt (5):
powerpc: ftrace, do not latency trace idleNow lets hope it looks good to Paul too and we can get his Acked-by :-)
Hmm, that first patch is really a bug fix. I wonder if we should push to get that into 28? It has a low impact, but it fixes a bug that is in current mainline.
-- Steve