]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/trace/trace_boot.c
hwmon: (adt7473) Fix voltage conversion routines
[linux-2.6-omap-h63xx.git] / kernel / trace / trace_boot.c
index fa8cca1be115627ff57004809828517dc63aea31..d0a5e50eeff26d17405ffa4cb62cbde710f9de05 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/init.h>
 #include <linux/debugfs.h>
 #include <linux/ftrace.h>
+#include <linux/kallsyms.h>
 
 #include "trace.h"
 
@@ -21,11 +22,16 @@ void start_boot_trace(void)
        trace_boot_enabled = 1;
 }
 
-void stop_boot_trace(struct trace_array *tr)
+void stop_boot_trace(void)
 {
        trace_boot_enabled = 0;
 }
 
+void reset_boot_trace(struct trace_array *tr)
+{
+       stop_boot_trace();
+}
+
 static void boot_trace_init(struct trace_array *tr)
 {
        int cpu;
@@ -42,38 +48,50 @@ static void boot_trace_ctrl_update(struct trace_array *tr)
        if (tr->ctrl)
                start_boot_trace();
        else
-               stop_boot_trace(tr);
+               stop_boot_trace();
 }
 
-static int initcall_print_line(struct trace_iterator *iter)
+static enum print_line_t initcall_print_line(struct trace_iterator *iter)
 {
-       int ret = 0;
+       int ret;
        struct trace_entry *entry = iter->ent;
        struct trace_boot *field = (struct trace_boot *)entry;
        struct boot_trace *it = &field->initcall;
        struct trace_seq *s = &iter->seq;
-
-       if (entry->type == TRACE_BOOT)
-               ret = trace_seq_printf(s, "%pF called from %i "
-                                      "returned %d after %lld msecs\n",
-                                      it->func, it->caller, it->result,
-                                      it->duration);
-       if (ret)
-               return 1;
-       return 0;
+       struct timespec calltime = ktime_to_timespec(it->calltime);
+       struct timespec rettime = ktime_to_timespec(it->rettime);
+
+       if (entry->type == TRACE_BOOT) {
+               ret = trace_seq_printf(s, "[%5ld.%09ld] 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.%09ld] 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;
+       }
+       return TRACE_TYPE_UNHANDLED;
 }
 
 struct tracer boot_tracer __read_mostly =
 {
        .name           = "initcall",
        .init           = boot_trace_init,
-       .reset          = stop_boot_trace,
+       .reset          = reset_boot_trace,
        .ctrl_update    = boot_trace_ctrl_update,
        .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;
@@ -84,6 +102,10 @@ void trace_boot(struct boot_trace *it)
        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()];
 
@@ -92,7 +114,7 @@ void trace_boot(struct boot_trace *it)
        if (!event)
                goto out;
        entry   = ring_buffer_event_data(event);
-       tracing_generic_entry_update(&entry->ent, 0);
+       tracing_generic_entry_update(&entry->ent, 0, 0);
        entry->ent.type = TRACE_BOOT;
        entry->initcall = *it;
        ring_buffer_unlock_commit(tr->buffer, event, irq_flags);