aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/ftrace.c
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2015-01-09 07:08:28 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2015-01-29 03:19:25 -0500
commite6d60b368b45b9be3aa068f8e5fa98c3487c9d4e (patch)
treeabe83543f72b5cd5d5de309dab8551f93c34f023 /arch/s390/kernel/ftrace.c
parent61f552141c9c0e88b3fdc7046265781ffd8fa68a (diff)
s390/ftrace: hotpatch support for function tracing
Make use of gcc's hotpatch support to generate better code for ftrace function tracing. The generated code now contains only a six byte nop in each function prologue instead of a 24 byte code block which will be runtime patched to support function tracing. With the new code generation the runtime overhead for supporting function tracing is close to zero, while the original code did show a significant performance impact. Acked-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/ftrace.c')
-rw-r--r--arch/s390/kernel/ftrace.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
index 3dabcae40e04..82c19899574f 100644
--- a/arch/s390/kernel/ftrace.c
+++ b/arch/s390/kernel/ftrace.c
@@ -46,6 +46,13 @@
46 * lg %r14,8(%r15) # offset 18 46 * lg %r14,8(%r15) # offset 18
47 * The jg instruction branches to offset 24 to skip as many instructions 47 * The jg instruction branches to offset 24 to skip as many instructions
48 * as possible. 48 * as possible.
49 * In case we use gcc's hotpatch feature the original and also the disabled
50 * function prologue contains only a single six byte instruction and looks
51 * like this:
52 * > brcl 0,0 # offset 0
53 * To enable ftrace the code gets patched like above and afterwards looks
54 * like this:
55 * > brasl %r0,ftrace_caller # offset 0
49 */ 56 */
50 57
51unsigned long ftrace_plt; 58unsigned long ftrace_plt;
@@ -64,9 +71,15 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
64 if (probe_kernel_read(&old, (void *) rec->ip, sizeof(old))) 71 if (probe_kernel_read(&old, (void *) rec->ip, sizeof(old)))
65 return -EFAULT; 72 return -EFAULT;
66 if (addr == MCOUNT_ADDR) { 73 if (addr == MCOUNT_ADDR) {
67 /* Initial code replacement; we expect to see stg r14,8(r15) */ 74 /* Initial code replacement */
75#ifdef CC_USING_HOTPATCH
76 /* We expect to see brcl 0,0 */
77 ftrace_generate_nop_insn(&orig);
78#else
79 /* We expect to see stg r14,8(r15) */
68 orig.opc = 0xe3e0; 80 orig.opc = 0xe3e0;
69 orig.disp = 0xf0080024; 81 orig.disp = 0xf0080024;
82#endif
70 ftrace_generate_nop_insn(&new); 83 ftrace_generate_nop_insn(&new);
71 } else if (old.opc == BREAKPOINT_INSTRUCTION) { 84 } else if (old.opc == BREAKPOINT_INSTRUCTION) {
72 /* 85 /*