]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - kernel/trace/trace_sched_switch.c
ftrace: remove add-hoc code
[mv-sheeva.git] / kernel / trace / trace_sched_switch.c
index 8b1cf1a3aee04cf76df33d17d498852408213284..5671db0e1827e99b7828cf84f36569a8a8dd4b26 100644 (file)
@@ -18,7 +18,7 @@ static struct trace_array     *ctx_trace;
 static int __read_mostly       tracer_enabled;
 
 static void
-ctx_switch_func(struct task_struct *prev, struct task_struct *next)
+ctx_switch_func(void *__rq, struct task_struct *prev, struct task_struct *next)
 {
        struct trace_array *tr = ctx_trace;
        struct trace_array_cpu *data;
@@ -29,6 +29,8 @@ ctx_switch_func(struct task_struct *prev, struct task_struct *next)
        if (!tracer_enabled)
                return;
 
+       tracing_record_cmdline(prev);
+
        local_irq_save(flags);
        cpu = raw_smp_processor_id();
        data = tr->data[cpu];
@@ -41,7 +43,8 @@ ctx_switch_func(struct task_struct *prev, struct task_struct *next)
        local_irq_restore(flags);
 }
 
-static void wakeup_func(struct task_struct *wakee, struct task_struct *curr)
+static void
+wakeup_func(void *__rq, struct task_struct *wakee, struct task_struct *curr)
 {
        struct trace_array *tr = ctx_trace;
        struct trace_array_cpu *data;
@@ -52,6 +55,8 @@ static void wakeup_func(struct task_struct *wakee, struct task_struct *curr)
        if (!tracer_enabled)
                return;
 
+       tracing_record_cmdline(curr);
+
        local_irq_save(flags);
        cpu = raw_smp_processor_id();
        data = tr->data[cpu];
@@ -64,15 +69,15 @@ static void wakeup_func(struct task_struct *wakee, struct task_struct *curr)
        local_irq_restore(flags);
 }
 
-void ftrace_ctx_switch(struct task_struct *prev, struct task_struct *next)
+void
+ftrace_ctx_switch(void *__rq, struct task_struct *prev,
+                 struct task_struct *next)
 {
-       tracing_record_cmdline(prev);
-
        /*
         * If tracer_switch_func only points to the local
         * switch func, it still needs the ptr passed to it.
         */
-       ctx_switch_func(prev, next);
+       ctx_switch_func(__rq, prev, next);
 
        /*
         * Chain to the wakeup tracer (this is a NOP if disabled):
@@ -81,11 +86,10 @@ void ftrace_ctx_switch(struct task_struct *prev, struct task_struct *next)
 }
 
 void
-ftrace_wake_up_task(struct task_struct *wakee, struct task_struct *curr)
+ftrace_wake_up_task(void *__rq, struct task_struct *wakee,
+                   struct task_struct *curr)
 {
-       tracing_record_cmdline(curr);
-
-       wakeup_func(wakee, curr);
+       wakeup_func(__rq, wakee, curr);
 
        /*
         * Chain to the wakeup tracer (this is a NOP if disabled):
@@ -93,6 +97,30 @@ ftrace_wake_up_task(struct task_struct *wakee, struct task_struct *curr)
        wakeup_sched_wakeup(wakee, curr);
 }
 
+void
+ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3)
+{
+       struct trace_array *tr = ctx_trace;
+       struct trace_array_cpu *data;
+       unsigned long flags;
+       long disabled;
+       int cpu;
+
+       if (!tracer_enabled)
+               return;
+
+       local_irq_save(flags);
+       cpu = raw_smp_processor_id();
+       data = tr->data[cpu];
+       disabled = atomic_inc_return(&data->disabled);
+
+       if (likely(disabled == 1))
+               __trace_special(tr, data, arg1, arg2, arg3);
+
+       atomic_dec(&data->disabled);
+       local_irq_restore(flags);
+}
+
 static void sched_switch_reset(struct trace_array *tr)
 {
        int cpu;