#include <linux/fs.h>
 #include <linux/init.h>
 #include <linux/types.h>
+#include <linux/kallsyms.h>
 
 extern int ftrace_enabled;
 extern int
 
 struct boot_trace {
        pid_t                   caller;
-       initcall_t              func;
+       char                    func[KSYM_NAME_LEN];
        int                     result;
        unsigned long long      duration;
        ktime_t                 calltime;
 };
 
 #ifdef CONFIG_BOOT_TRACER
-extern void trace_boot(struct boot_trace *it);
+extern void trace_boot(struct boot_trace *it, initcall_t fn);
 extern void start_boot_trace(void);
 #else
-static inline void trace_boot(struct boot_trace *it) { }
+static inline void trace_boot(struct boot_trace *it, initcall_t fn) { }
 static inline void start_boot_trace(void) { }
 #endif
 
 
 
        if (initcall_debug) {
                it.caller = task_pid_nr(current);
-               it.func = fn;
                printk("calling  %pF @ %i\n", fn, it.caller);
                it.calltime = ktime_get();
        }
                it.duration = (unsigned long long) delta.tv64 >> 20;
                printk("initcall %pF returned %d after %Ld msecs\n", fn,
                        it.result, it.duration);
-               trace_boot(&it);
+               trace_boot(&it, fn);
        }
 
        msgbuf[0] = 0;
 
 #include <linux/init.h>
 #include <linux/debugfs.h>
 #include <linux/ftrace.h>
+#include <linux/kallsyms.h>
 
 #include "trace.h"
 
        struct timespec rettime = ktime_to_timespec(it->rettime);
 
        if (entry->type == TRACE_BOOT) {
-               ret = trace_seq_printf(s, "[%5ld.%06ld] calling  %pF @ %i\n",
+               ret = trace_seq_printf(s, "[%5ld.%06ld] calling  %s @ %i\n",
                                          calltime.tv_sec,
                                          calltime.tv_nsec,
                                          it->func, it->caller);
                if (!ret)
                        return TRACE_TYPE_PARTIAL_LINE;
-               ret = trace_seq_printf(s, "[%5ld.%06ld] initcall %pF "
+
+               ret = trace_seq_printf(s, "[%5ld.%06ld] initcall %s "
                                          "returned %d after %lld msecs\n",
                                          rettime.tv_sec,
                                          rettime.tv_nsec,
                                          it->func, it->result, it->duration);
+
                if (!ret)
                        return TRACE_TYPE_PARTIAL_LINE;
                return TRACE_TYPE_HANDLED;
        .print_line     = initcall_print_line,
 };
 
-
-void trace_boot(struct boot_trace *it)
+void trace_boot(struct boot_trace *it, initcall_t fn)
 {
        struct ring_buffer_event *event;
        struct trace_boot *entry;
        if (!trace_boot_enabled)
                return;
 
+       /* Get its name now since this function could
+        * disappear because it is in the .init section.
+        */
+       sprint_symbol(it->func, (unsigned long)fn);
        preempt_disable();
        data = tr->data[smp_processor_id()];