diff options
| -rw-r--r-- | arch/x86/kernel/Makefile | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/process_32.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/process_64.c | 4 | ||||
| -rw-r--r-- | include/linux/ftrace.h | 11 | ||||
| -rw-r--r-- | kernel/Makefile | 4 | ||||
| -rw-r--r-- | kernel/extable.c | 5 | ||||
| -rw-r--r-- | kernel/module.c | 2 |
7 files changed, 21 insertions, 15 deletions
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index a3049da61985..1cad9318d217 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
| @@ -14,12 +14,6 @@ CFLAGS_REMOVE_paravirt-spinlocks.o = -pg | |||
| 14 | CFLAGS_REMOVE_ftrace.o = -pg | 14 | CFLAGS_REMOVE_ftrace.o = -pg |
| 15 | endif | 15 | endif |
| 16 | 16 | ||
| 17 | ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 18 | # Don't trace __switch_to() but let it for function tracer | ||
| 19 | CFLAGS_REMOVE_process_32.o = -pg | ||
| 20 | CFLAGS_REMOVE_process_64.o = -pg | ||
| 21 | endif | ||
| 22 | |||
| 23 | # | 17 | # |
| 24 | # vsyscalls (which work on the user stack) should have | 18 | # vsyscalls (which work on the user stack) should have |
| 25 | # no stack-protector checks: | 19 | # no stack-protector checks: |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 0a1302fe6d45..24c2276aa453 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/percpu.h> | 38 | #include <linux/percpu.h> |
| 39 | #include <linux/prctl.h> | 39 | #include <linux/prctl.h> |
| 40 | #include <linux/dmi.h> | 40 | #include <linux/dmi.h> |
| 41 | #include <linux/ftrace.h> | ||
| 41 | 42 | ||
| 42 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
| 43 | #include <asm/pgtable.h> | 44 | #include <asm/pgtable.h> |
| @@ -548,7 +549,8 @@ __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, | |||
| 548 | * the task-switch, and shows up in ret_from_fork in entry.S, | 549 | * the task-switch, and shows up in ret_from_fork in entry.S, |
| 549 | * for example. | 550 | * for example. |
| 550 | */ | 551 | */ |
| 551 | struct task_struct * __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | 552 | __notrace_funcgraph struct task_struct * |
| 553 | __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | ||
| 552 | { | 554 | { |
| 553 | struct thread_struct *prev = &prev_p->thread, | 555 | struct thread_struct *prev = &prev_p->thread, |
| 554 | *next = &next_p->thread; | 556 | *next = &next_p->thread; |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index c958120fb1b6..fbb321d53d34 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #include <linux/prctl.h> | 39 | #include <linux/prctl.h> |
| 40 | #include <linux/uaccess.h> | 40 | #include <linux/uaccess.h> |
| 41 | #include <linux/io.h> | 41 | #include <linux/io.h> |
| 42 | #include <linux/ftrace.h> | ||
| 42 | 43 | ||
| 43 | #include <asm/pgtable.h> | 44 | #include <asm/pgtable.h> |
| 44 | #include <asm/system.h> | 45 | #include <asm/system.h> |
| @@ -551,8 +552,9 @@ static inline void __switch_to_xtra(struct task_struct *prev_p, | |||
| 551 | * - could test fs/gs bitsliced | 552 | * - could test fs/gs bitsliced |
| 552 | * | 553 | * |
| 553 | * Kprobes not supported here. Set the probe on schedule instead. | 554 | * Kprobes not supported here. Set the probe on schedule instead. |
| 555 | * Function graph tracer not supported too. | ||
| 554 | */ | 556 | */ |
| 555 | struct task_struct * | 557 | __notrace_funcgraph struct task_struct * |
| 556 | __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | 558 | __switch_to(struct task_struct *prev_p, struct task_struct *next_p) |
| 557 | { | 559 | { |
| 558 | struct thread_struct *prev = &prev_p->thread; | 560 | struct thread_struct *prev = &prev_p->thread; |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index b9b4d0a22d10..449fa8e9e34f 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
| @@ -369,6 +369,14 @@ struct ftrace_graph_ret { | |||
| 369 | }; | 369 | }; |
| 370 | 370 | ||
| 371 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 371 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 372 | |||
| 373 | /* | ||
| 374 | * Sometimes we don't want to trace a function with the function | ||
| 375 | * graph tracer but we want them to keep traced by the usual function | ||
| 376 | * tracer if the function graph tracer is not configured. | ||
| 377 | */ | ||
| 378 | #define __notrace_funcgraph notrace | ||
| 379 | |||
| 372 | #define FTRACE_RETFUNC_DEPTH 50 | 380 | #define FTRACE_RETFUNC_DEPTH 50 |
| 373 | #define FTRACE_RETSTACK_ALLOC_SIZE 32 | 381 | #define FTRACE_RETSTACK_ALLOC_SIZE 32 |
| 374 | /* Type of the callback handlers for tracing function graph*/ | 382 | /* Type of the callback handlers for tracing function graph*/ |
| @@ -394,6 +402,9 @@ static inline int task_curr_ret_stack(struct task_struct *t) | |||
| 394 | return t->curr_ret_stack; | 402 | return t->curr_ret_stack; |
| 395 | } | 403 | } |
| 396 | #else | 404 | #else |
| 405 | |||
| 406 | #define __notrace_funcgraph | ||
| 407 | |||
| 397 | static inline void ftrace_graph_init_task(struct task_struct *t) { } | 408 | static inline void ftrace_graph_init_task(struct task_struct *t) { } |
| 398 | static inline void ftrace_graph_exit_task(struct task_struct *t) { } | 409 | static inline void ftrace_graph_exit_task(struct task_struct *t) { } |
| 399 | 410 | ||
diff --git a/kernel/Makefile b/kernel/Makefile index 703cf3b7389c..19fad003b19d 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
| @@ -21,10 +21,6 @@ CFLAGS_REMOVE_cgroup-debug.o = -pg | |||
| 21 | CFLAGS_REMOVE_sched_clock.o = -pg | 21 | CFLAGS_REMOVE_sched_clock.o = -pg |
| 22 | CFLAGS_REMOVE_sched.o = -pg | 22 | CFLAGS_REMOVE_sched.o = -pg |
| 23 | endif | 23 | endif |
| 24 | ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 25 | CFLAGS_REMOVE_extable.o = -pg # For __kernel_text_address() | ||
| 26 | CFLAGS_REMOVE_module.o = -pg # For __module_text_address() | ||
| 27 | endif | ||
| 28 | 24 | ||
| 29 | obj-$(CONFIG_FREEZER) += freezer.o | 25 | obj-$(CONFIG_FREEZER) += freezer.o |
| 30 | obj-$(CONFIG_PROFILING) += profile.o | 26 | obj-$(CONFIG_PROFILING) += profile.o |
diff --git a/kernel/extable.c b/kernel/extable.c index a26cb2e17023..feb0317cf09a 100644 --- a/kernel/extable.c +++ b/kernel/extable.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | */ | 17 | */ |
| 18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | #include <linux/ftrace.h> | ||
| 20 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
| 21 | #include <asm/sections.h> | 22 | #include <asm/sections.h> |
| 22 | 23 | ||
| @@ -40,7 +41,7 @@ const struct exception_table_entry *search_exception_tables(unsigned long addr) | |||
| 40 | return e; | 41 | return e; |
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | int core_kernel_text(unsigned long addr) | 44 | __notrace_funcgraph int core_kernel_text(unsigned long addr) |
| 44 | { | 45 | { |
| 45 | if (addr >= (unsigned long)_stext && | 46 | if (addr >= (unsigned long)_stext && |
| 46 | addr <= (unsigned long)_etext) | 47 | addr <= (unsigned long)_etext) |
| @@ -53,7 +54,7 @@ int core_kernel_text(unsigned long addr) | |||
| 53 | return 0; | 54 | return 0; |
| 54 | } | 55 | } |
| 55 | 56 | ||
| 56 | int __kernel_text_address(unsigned long addr) | 57 | __notrace_funcgraph int __kernel_text_address(unsigned long addr) |
| 57 | { | 58 | { |
| 58 | if (core_kernel_text(addr)) | 59 | if (core_kernel_text(addr)) |
| 59 | return 1; | 60 | return 1; |
diff --git a/kernel/module.c b/kernel/module.c index 89bcf7c1327d..dd2a54155b54 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
| @@ -2704,7 +2704,7 @@ int is_module_address(unsigned long addr) | |||
| 2704 | 2704 | ||
| 2705 | 2705 | ||
| 2706 | /* Is this a valid kernel address? */ | 2706 | /* Is this a valid kernel address? */ |
| 2707 | struct module *__module_text_address(unsigned long addr) | 2707 | __notrace_funcgraph struct module *__module_text_address(unsigned long addr) |
| 2708 | { | 2708 | { |
| 2709 | struct module *mod; | 2709 | struct module *mod; |
| 2710 | 2710 | ||
