summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2014-08-15 12:33:46 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2014-09-09 08:53:28 +0200
commit2481a87b0250bbf429fc8cdc78331efbc44a0221 (patch)
tree0bf818ad656c2c12bbe4bc5b7882c99826439b93
parent0f1b1ff54b386926ef1a524e60ef89ae7738bbd5 (diff)
downloadop-kernel-dev-2481a87b0250bbf429fc8cdc78331efbc44a0221.zip
op-kernel-dev-2481a87b0250bbf429fc8cdc78331efbc44a0221.tar.gz
s390/ftrace: optimize function graph caller code
When the function graph tracer is disabled we can skip three additional instructions. So let's just do this. So if function tracing is enabled but function graph tracing is runtime disabled, we get away with a single unconditional branch. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--arch/s390/include/asm/ftrace.h1
-rw-r--r--arch/s390/kernel/ftrace.c24
-rw-r--r--arch/s390/kernel/mcount64.S15
3 files changed, 34 insertions, 6 deletions
diff --git a/arch/s390/include/asm/ftrace.h b/arch/s390/include/asm/ftrace.h
index bf246da..7b8e456 100644
--- a/arch/s390/include/asm/ftrace.h
+++ b/arch/s390/include/asm/ftrace.h
@@ -4,6 +4,7 @@
#ifndef __ASSEMBLY__
extern void _mcount(void);
+extern char ftrace_graph_caller_end;
struct dyn_arch_ftrace { };
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
index 54d6493..de55efa 100644
--- a/arch/s390/kernel/ftrace.c
+++ b/arch/s390/kernel/ftrace.c
@@ -170,6 +170,29 @@ out:
* directly after the instructions. To enable the call we calculate
* the original offset to prepare_ftrace_return and put it back.
*/
+
+#ifdef CONFIG_64BIT
+
+int ftrace_enable_ftrace_graph_caller(void)
+{
+ static unsigned short offset = 0x0002;
+
+ return probe_kernel_write((void *) ftrace_graph_caller + 2,
+ &offset, sizeof(offset));
+}
+
+int ftrace_disable_ftrace_graph_caller(void)
+{
+ unsigned short offset;
+
+ offset = ((void *) &ftrace_graph_caller_end -
+ (void *) ftrace_graph_caller) / 2;
+ return probe_kernel_write((void *) ftrace_graph_caller + 2,
+ &offset, sizeof(offset));
+}
+
+#else /* CONFIG_64BIT */
+
int ftrace_enable_ftrace_graph_caller(void)
{
unsigned short offset;
@@ -188,5 +211,6 @@ int ftrace_disable_ftrace_graph_caller(void)
&offset, sizeof(offset));
}
+#endif /* CONFIG_64BIT */
#endif /* CONFIG_DYNAMIC_FTRACE */
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
diff --git a/arch/s390/kernel/mcount64.S b/arch/s390/kernel/mcount64.S
index c67a8bf..5b33c83 100644
--- a/arch/s390/kernel/mcount64.S
+++ b/arch/s390/kernel/mcount64.S
@@ -32,14 +32,17 @@ ENTRY(ftrace_caller)
lg %r14,0(%r14)
basr %r14,%r14
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+# The j instruction gets runtime patched to a nop instruction.
+# See ftrace_enable_ftrace_graph_caller. The patched instruction is:
+# j .+4
+ENTRY(ftrace_graph_caller)
+ j ftrace_graph_caller_end
lg %r2,168(%r15)
lg %r3,272(%r15)
-ENTRY(ftrace_graph_caller)
-# The bras instruction gets runtime patched to call prepare_ftrace_return.
-# See ftrace_enable_ftrace_graph_caller. The patched instruction is:
-# bras %r14,prepare_ftrace_return
- bras %r14,0f
-0: stg %r2,168(%r15)
+ brasl %r14,prepare_ftrace_return
+ stg %r2,168(%r15)
+ftrace_graph_caller_end:
+ .globl ftrace_graph_caller_end
#endif
aghi %r15,160
lmg %r2,%r5,32(%r15)
OpenPOWER on IntegriCloud