diff options
-rw-r--r-- | include/linux/ftrace.h | 7 | ||||
-rw-r--r-- | init/main.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace_boot.c | 14 |
3 files changed, 15 insertions, 9 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 4455490d91bd..e672e51c40a9 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/fs.h> | 7 | #include <linux/fs.h> |
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
10 | #include <linux/kallsyms.h> | ||
10 | 11 | ||
11 | extern int ftrace_enabled; | 12 | extern int ftrace_enabled; |
12 | extern int | 13 | extern int |
@@ -213,7 +214,7 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { } | |||
213 | 214 | ||
214 | struct boot_trace { | 215 | struct boot_trace { |
215 | pid_t caller; | 216 | pid_t caller; |
216 | initcall_t func; | 217 | char func[KSYM_NAME_LEN]; |
217 | int result; | 218 | int result; |
218 | unsigned long long duration; | 219 | unsigned long long duration; |
219 | ktime_t calltime; | 220 | ktime_t calltime; |
@@ -221,10 +222,10 @@ struct boot_trace { | |||
221 | }; | 222 | }; |
222 | 223 | ||
223 | #ifdef CONFIG_BOOT_TRACER | 224 | #ifdef CONFIG_BOOT_TRACER |
224 | extern void trace_boot(struct boot_trace *it); | 225 | extern void trace_boot(struct boot_trace *it, initcall_t fn); |
225 | extern void start_boot_trace(void); | 226 | extern void start_boot_trace(void); |
226 | #else | 227 | #else |
227 | static inline void trace_boot(struct boot_trace *it) { } | 228 | static inline void trace_boot(struct boot_trace *it, initcall_t fn) { } |
228 | static inline void start_boot_trace(void) { } | 229 | static inline void start_boot_trace(void) { } |
229 | #endif | 230 | #endif |
230 | 231 | ||
diff --git a/init/main.c b/init/main.c index 61eb66159391..8e96a0ef17f4 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -712,7 +712,6 @@ int do_one_initcall(initcall_t fn) | |||
712 | 712 | ||
713 | if (initcall_debug) { | 713 | if (initcall_debug) { |
714 | it.caller = task_pid_nr(current); | 714 | it.caller = task_pid_nr(current); |
715 | it.func = fn; | ||
716 | printk("calling %pF @ %i\n", fn, it.caller); | 715 | printk("calling %pF @ %i\n", fn, it.caller); |
717 | it.calltime = ktime_get(); | 716 | it.calltime = ktime_get(); |
718 | } | 717 | } |
@@ -725,7 +724,7 @@ int do_one_initcall(initcall_t fn) | |||
725 | it.duration = (unsigned long long) delta.tv64 >> 20; | 724 | it.duration = (unsigned long long) delta.tv64 >> 20; |
726 | printk("initcall %pF returned %d after %Ld msecs\n", fn, | 725 | printk("initcall %pF returned %d after %Ld msecs\n", fn, |
727 | it.result, it.duration); | 726 | it.result, it.duration); |
728 | trace_boot(&it); | 727 | trace_boot(&it, fn); |
729 | } | 728 | } |
730 | 729 | ||
731 | msgbuf[0] = 0; | 730 | msgbuf[0] = 0; |
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c index 7c15f3e68ba3..b9dc2c0093ab 100644 --- a/kernel/trace/trace_boot.c +++ b/kernel/trace/trace_boot.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <linux/debugfs.h> | 9 | #include <linux/debugfs.h> |
10 | #include <linux/ftrace.h> | 10 | #include <linux/ftrace.h> |
11 | #include <linux/kallsyms.h> | ||
11 | 12 | ||
12 | #include "trace.h" | 13 | #include "trace.h" |
13 | 14 | ||
@@ -56,17 +57,19 @@ static enum print_line_t initcall_print_line(struct trace_iterator *iter) | |||
56 | struct timespec rettime = ktime_to_timespec(it->rettime); | 57 | struct timespec rettime = ktime_to_timespec(it->rettime); |
57 | 58 | ||
58 | if (entry->type == TRACE_BOOT) { | 59 | if (entry->type == TRACE_BOOT) { |
59 | ret = trace_seq_printf(s, "[%5ld.%06ld] calling %pF @ %i\n", | 60 | ret = trace_seq_printf(s, "[%5ld.%06ld] calling %s @ %i\n", |
60 | calltime.tv_sec, | 61 | calltime.tv_sec, |
61 | calltime.tv_nsec, | 62 | calltime.tv_nsec, |
62 | it->func, it->caller); | 63 | it->func, it->caller); |
63 | if (!ret) | 64 | if (!ret) |
64 | return TRACE_TYPE_PARTIAL_LINE; | 65 | return TRACE_TYPE_PARTIAL_LINE; |
65 | ret = trace_seq_printf(s, "[%5ld.%06ld] initcall %pF " | 66 | |
67 | ret = trace_seq_printf(s, "[%5ld.%06ld] initcall %s " | ||
66 | "returned %d after %lld msecs\n", | 68 | "returned %d after %lld msecs\n", |
67 | rettime.tv_sec, | 69 | rettime.tv_sec, |
68 | rettime.tv_nsec, | 70 | rettime.tv_nsec, |
69 | it->func, it->result, it->duration); | 71 | it->func, it->result, it->duration); |
72 | |||
70 | if (!ret) | 73 | if (!ret) |
71 | return TRACE_TYPE_PARTIAL_LINE; | 74 | return TRACE_TYPE_PARTIAL_LINE; |
72 | return TRACE_TYPE_HANDLED; | 75 | return TRACE_TYPE_HANDLED; |
@@ -83,8 +86,7 @@ struct tracer boot_tracer __read_mostly = | |||
83 | .print_line = initcall_print_line, | 86 | .print_line = initcall_print_line, |
84 | }; | 87 | }; |
85 | 88 | ||
86 | 89 | void trace_boot(struct boot_trace *it, initcall_t fn) | |
87 | void trace_boot(struct boot_trace *it) | ||
88 | { | 90 | { |
89 | struct ring_buffer_event *event; | 91 | struct ring_buffer_event *event; |
90 | struct trace_boot *entry; | 92 | struct trace_boot *entry; |
@@ -95,6 +97,10 @@ void trace_boot(struct boot_trace *it) | |||
95 | if (!trace_boot_enabled) | 97 | if (!trace_boot_enabled) |
96 | return; | 98 | return; |
97 | 99 | ||
100 | /* Get its name now since this function could | ||
101 | * disappear because it is in the .init section. | ||
102 | */ | ||
103 | sprint_symbol(it->func, (unsigned long)fn); | ||
98 | preempt_disable(); | 104 | preempt_disable(); |
99 | data = tr->data[smp_processor_id()]; | 105 | data = tr->data[smp_processor_id()]; |
100 | 106 | ||