sizes.h: add SZ_8G/SZ_16G/SZ_32G macros
[linux-2.6-microblaze.git] / kernel / trace / trace.c
index 0613418..b8a2d78 100644 (file)
@@ -68,10 +68,21 @@ bool ring_buffer_expanded;
 static bool __read_mostly tracing_selftest_running;
 
 /*
- * If a tracer is running, we do not want to run SELFTEST.
+ * If boot-time tracing including tracers/events via kernel cmdline
+ * is running, we do not want to run SELFTEST.
  */
 bool __read_mostly tracing_selftest_disabled;
 
+#ifdef CONFIG_FTRACE_STARTUP_TEST
+void __init disable_tracing_selftest(const char *reason)
+{
+       if (!tracing_selftest_disabled) {
+               tracing_selftest_disabled = true;
+               pr_info("Ftrace startup test is disabled due to %s\n", reason);
+       }
+}
+#endif
+
 /* Pipe tracepoints to printk */
 struct trace_iterator *tracepoint_print_iter;
 int tracepoint_printk;
@@ -2113,11 +2124,7 @@ int __init register_tracer(struct tracer *type)
        apply_trace_boot_options();
 
        /* disable other selftests, since this will break it. */
-       tracing_selftest_disabled = true;
-#ifdef CONFIG_FTRACE_STARTUP_TEST
-       printk(KERN_INFO "Disabling FTRACE selftests due to running tracer '%s'\n",
-              type->name);
-#endif
+       disable_tracing_selftest("running a tracer");
 
  out_unlock:
        return ret;
@@ -3121,7 +3128,7 @@ struct trace_buffer_struct {
 static struct trace_buffer_struct *trace_percpu_buffer;
 
 /*
- * Thise allows for lockless recording.  If we're nested too deeply, then
+ * This allows for lockless recording.  If we're nested too deeply, then
  * this returns NULL.
  */
 static char *get_trace_buf(void)
@@ -9062,7 +9069,10 @@ int tracing_init_dentry(void)
 extern struct trace_eval_map *__start_ftrace_eval_maps[];
 extern struct trace_eval_map *__stop_ftrace_eval_maps[];
 
-static void __init trace_eval_init(void)
+static struct workqueue_struct *eval_map_wq __initdata;
+static struct work_struct eval_map_work __initdata;
+
+static void __init eval_map_work_func(struct work_struct *work)
 {
        int len;
 
@@ -9070,6 +9080,33 @@ static void __init trace_eval_init(void)
        trace_insert_eval_map(NULL, __start_ftrace_eval_maps, len);
 }
 
+static int __init trace_eval_init(void)
+{
+       INIT_WORK(&eval_map_work, eval_map_work_func);
+
+       eval_map_wq = alloc_workqueue("eval_map_wq", WQ_UNBOUND, 0);
+       if (!eval_map_wq) {
+               pr_err("Unable to allocate eval_map_wq\n");
+               /* Do work here */
+               eval_map_work_func(&eval_map_work);
+               return -ENOMEM;
+       }
+
+       queue_work(eval_map_wq, &eval_map_work);
+       return 0;
+}
+
+static int __init trace_eval_sync(void)
+{
+       /* Make sure the eval map updates are finished */
+       if (eval_map_wq)
+               destroy_workqueue(eval_map_wq);
+       return 0;
+}
+
+late_initcall_sync(trace_eval_sync);
+
+
 #ifdef CONFIG_MODULES
 static void trace_module_add_evals(struct module *mod)
 {