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 | ||