diff options
| -rw-r--r-- | arch/powerpc/kernel/ftrace.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/ftrace.c | 2 | ||||
| -rw-r--r-- | arch/x86/Kconfig | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_64.S | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/ftrace.c | 6 | ||||
| -rw-r--r-- | include/linux/ftrace.h | 4 | ||||
| -rw-r--r-- | include/linux/trace_seq.h | 2 | ||||
| -rw-r--r-- | kernel/trace/Kconfig | 8 | ||||
| -rw-r--r-- | kernel/trace/ftrace.c | 7 | ||||
| -rw-r--r-- | kernel/trace/kmemtrace.c | 2 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer.c | 311 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer_benchmark.c | 45 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 8 | ||||
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 37 | ||||
| -rw-r--r-- | kernel/trace/trace_functions.c | 8 | ||||
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 36 | ||||
| -rw-r--r-- | samples/trace_events/Makefile | 8 | ||||
| -rw-r--r-- | samples/trace_events/trace-events-sample.h | 27 |
19 files changed, 332 insertions, 186 deletions
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c index 1b12696cca06..ce1f3e44c24f 100644 --- a/arch/powerpc/kernel/ftrace.c +++ b/arch/powerpc/kernel/ftrace.c | |||
| @@ -586,7 +586,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | |||
| 586 | return; | 586 | return; |
| 587 | } | 587 | } |
| 588 | 588 | ||
| 589 | if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) { | 589 | if (ftrace_push_return_trace(old, self_addr, &trace.depth, 0) == -EBUSY) { |
| 590 | *parent = old; | 590 | *parent = old; |
| 591 | return; | 591 | return; |
| 592 | } | 592 | } |
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c index 82ddfd3a75af..3e298e64f0db 100644 --- a/arch/s390/kernel/ftrace.c +++ b/arch/s390/kernel/ftrace.c | |||
| @@ -190,7 +190,7 @@ unsigned long prepare_ftrace_return(unsigned long ip, unsigned long parent) | |||
| 190 | goto out; | 190 | goto out; |
| 191 | if (unlikely(atomic_read(¤t->tracing_graph_pause))) | 191 | if (unlikely(atomic_read(¤t->tracing_graph_pause))) |
| 192 | goto out; | 192 | goto out; |
| 193 | if (ftrace_push_return_trace(parent, ip, &trace.depth) == -EBUSY) | 193 | if (ftrace_push_return_trace(parent, ip, &trace.depth, 0) == -EBUSY) |
| 194 | goto out; | 194 | goto out; |
| 195 | trace.func = ftrace_mcount_call_adjust(ip) & PSW_ADDR_INSN; | 195 | trace.func = ftrace_mcount_call_adjust(ip) & PSW_ADDR_INSN; |
| 196 | /* Only trace if the calling function expects to. */ | 196 | /* Only trace if the calling function expects to. */ |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 73c0bda73fcd..d1430ef6b4f9 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -34,6 +34,7 @@ config X86 | |||
| 34 | select HAVE_DYNAMIC_FTRACE | 34 | select HAVE_DYNAMIC_FTRACE |
| 35 | select HAVE_FUNCTION_TRACER | 35 | select HAVE_FUNCTION_TRACER |
| 36 | select HAVE_FUNCTION_GRAPH_TRACER | 36 | select HAVE_FUNCTION_GRAPH_TRACER |
| 37 | select HAVE_FUNCTION_GRAPH_FP_TEST | ||
| 37 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST | 38 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST |
| 38 | select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE | 39 | select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE |
| 39 | select HAVE_FTRACE_SYSCALLS | 40 | select HAVE_FTRACE_SYSCALLS |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 9f8ce77dbc64..c097e7d607c6 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -1174,6 +1174,7 @@ ENTRY(ftrace_graph_caller) | |||
| 1174 | pushl %edx | 1174 | pushl %edx |
| 1175 | movl 0xc(%esp), %edx | 1175 | movl 0xc(%esp), %edx |
| 1176 | lea 0x4(%ebp), %eax | 1176 | lea 0x4(%ebp), %eax |
| 1177 | movl (%ebp), %ecx | ||
| 1177 | subl $MCOUNT_INSN_SIZE, %edx | 1178 | subl $MCOUNT_INSN_SIZE, %edx |
| 1178 | call prepare_ftrace_return | 1179 | call prepare_ftrace_return |
| 1179 | popl %edx | 1180 | popl %edx |
| @@ -1188,6 +1189,7 @@ return_to_handler: | |||
| 1188 | pushl %eax | 1189 | pushl %eax |
| 1189 | pushl %ecx | 1190 | pushl %ecx |
| 1190 | pushl %edx | 1191 | pushl %edx |
| 1192 | movl %ebp, %eax | ||
| 1191 | call ftrace_return_to_handler | 1193 | call ftrace_return_to_handler |
| 1192 | movl %eax, 0xc(%esp) | 1194 | movl %eax, 0xc(%esp) |
| 1193 | popl %edx | 1195 | popl %edx |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index de74f0a3e0ed..c251be745107 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -135,6 +135,7 @@ ENTRY(ftrace_graph_caller) | |||
| 135 | 135 | ||
| 136 | leaq 8(%rbp), %rdi | 136 | leaq 8(%rbp), %rdi |
| 137 | movq 0x38(%rsp), %rsi | 137 | movq 0x38(%rsp), %rsi |
| 138 | movq (%rbp), %rdx | ||
| 138 | subq $MCOUNT_INSN_SIZE, %rsi | 139 | subq $MCOUNT_INSN_SIZE, %rsi |
| 139 | 140 | ||
| 140 | call prepare_ftrace_return | 141 | call prepare_ftrace_return |
| @@ -150,6 +151,7 @@ GLOBAL(return_to_handler) | |||
| 150 | /* Save the return values */ | 151 | /* Save the return values */ |
| 151 | movq %rax, (%rsp) | 152 | movq %rax, (%rsp) |
| 152 | movq %rdx, 8(%rsp) | 153 | movq %rdx, 8(%rsp) |
| 154 | movq %rbp, %rdi | ||
| 153 | 155 | ||
| 154 | call ftrace_return_to_handler | 156 | call ftrace_return_to_handler |
| 155 | 157 | ||
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index b79c5533c421..d94e1ea3b9fe 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
| @@ -408,7 +408,8 @@ int ftrace_disable_ftrace_graph_caller(void) | |||
| 408 | * Hook the return address and push it in the stack of return addrs | 408 | * Hook the return address and push it in the stack of return addrs |
| 409 | * in current thread info. | 409 | * in current thread info. |
| 410 | */ | 410 | */ |
| 411 | void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | 411 | void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, |
| 412 | unsigned long frame_pointer) | ||
| 412 | { | 413 | { |
| 413 | unsigned long old; | 414 | unsigned long old; |
| 414 | int faulted; | 415 | int faulted; |
| @@ -453,7 +454,8 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | |||
| 453 | return; | 454 | return; |
| 454 | } | 455 | } |
| 455 | 456 | ||
| 456 | if (ftrace_push_return_trace(old, self_addr, &trace.depth) == -EBUSY) { | 457 | if (ftrace_push_return_trace(old, self_addr, &trace.depth, |
| 458 | frame_pointer) == -EBUSY) { | ||
| 457 | *parent = old; | 459 | *parent = old; |
| 458 | return; | 460 | return; |
| 459 | } | 461 | } |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 39b95c56587e..dc3b1328aaeb 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -362,6 +362,7 @@ struct ftrace_ret_stack { | |||
| 362 | unsigned long func; | 362 | unsigned long func; |
| 363 | unsigned long long calltime; | 363 | unsigned long long calltime; |
| 364 | unsigned long long subtime; | 364 | unsigned long long subtime; |
| 365 | unsigned long fp; | ||
| 365 | }; | 366 | }; |
| 366 | 367 | ||
| 367 | /* | 368 | /* |
| @@ -372,7 +373,8 @@ struct ftrace_ret_stack { | |||
| 372 | extern void return_to_handler(void); | 373 | extern void return_to_handler(void); |
| 373 | 374 | ||
| 374 | extern int | 375 | extern int |
| 375 | ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth); | 376 | ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth, |
| 377 | unsigned long frame_pointer); | ||
| 376 | 378 | ||
| 377 | /* | 379 | /* |
| 378 | * Sometimes we don't want to trace a function with the function | 380 | * Sometimes we don't want to trace a function with the function |
diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h index c68bccba2074..c134dd1fe6b6 100644 --- a/include/linux/trace_seq.h +++ b/include/linux/trace_seq.h | |||
| @@ -3,6 +3,8 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/fs.h> | 4 | #include <linux/fs.h> |
| 5 | 5 | ||
| 6 | #include <asm/page.h> | ||
| 7 | |||
| 6 | /* | 8 | /* |
| 7 | * Trace sequences are used to allow a function to call several other functions | 9 | * Trace sequences are used to allow a function to call several other functions |
| 8 | * to create a string of data to use (up to a max of PAGE_SIZE. | 10 | * to create a string of data to use (up to a max of PAGE_SIZE. |
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index 61071fecc82e..1551f47e7669 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig | |||
| @@ -18,6 +18,13 @@ config HAVE_FUNCTION_TRACER | |||
| 18 | config HAVE_FUNCTION_GRAPH_TRACER | 18 | config HAVE_FUNCTION_GRAPH_TRACER |
| 19 | bool | 19 | bool |
| 20 | 20 | ||
| 21 | config HAVE_FUNCTION_GRAPH_FP_TEST | ||
| 22 | bool | ||
| 23 | help | ||
| 24 | An arch may pass in a unique value (frame pointer) to both the | ||
| 25 | entering and exiting of a function. On exit, the value is compared | ||
| 26 | and if it does not match, then it will panic the kernel. | ||
| 27 | |||
| 21 | config HAVE_FUNCTION_TRACE_MCOUNT_TEST | 28 | config HAVE_FUNCTION_TRACE_MCOUNT_TEST |
| 22 | bool | 29 | bool |
| 23 | help | 30 | help |
| @@ -121,6 +128,7 @@ config FUNCTION_GRAPH_TRACER | |||
| 121 | bool "Kernel Function Graph Tracer" | 128 | bool "Kernel Function Graph Tracer" |
| 122 | depends on HAVE_FUNCTION_GRAPH_TRACER | 129 | depends on HAVE_FUNCTION_GRAPH_TRACER |
| 123 | depends on FUNCTION_TRACER | 130 | depends on FUNCTION_TRACER |
| 131 | depends on !X86_32 || !CC_OPTIMIZE_FOR_SIZE | ||
| 124 | default y | ||
