tracing: Move tracepoint callbacks from declaration to definition
[linux-2.6.git] / kernel / tracepoint.c
index 9e0a36f..1a6a453 100644 (file)
@@ -243,6 +243,11 @@ static void set_tracepoint(struct tracepoint_entry **entry,
 {
        WARN_ON(strcmp((*entry)->name, elem->name) != 0);
 
+       if (elem->regfunc && !elem->state && active)
+               elem->regfunc();
+       else if (elem->unregfunc && elem->state && !active)
+               elem->unregfunc();
+
        /*
         * rcu_assign_pointer has a smp_wmb() which makes sure that the new
         * probe callbacks array is consistent before setting a pointer to it.
@@ -262,6 +267,9 @@ static void set_tracepoint(struct tracepoint_entry **entry,
  */
 static void disable_tracepoint(struct tracepoint *elem)
 {
+       if (elem->unregfunc && elem->state)
+               elem->unregfunc();
+
        elem->state = 0;
        rcu_assign_pointer(elem->funcs, NULL);
 }
@@ -578,7 +586,7 @@ __initcall(init_tracepoints);
 
 #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
 
-static DEFINE_MUTEX(regfunc_mutex);
+/* NB: reg/unreg are called while guarded with the tracepoints_mutex */
 static int sys_tracepoint_refcount;
 
 void syscall_regfunc(void)
@@ -586,7 +594,6 @@ void syscall_regfunc(void)
        unsigned long flags;
        struct task_struct *g, *t;
 
-       mutex_lock(&regfunc_mutex);
        if (!sys_tracepoint_refcount) {
                read_lock_irqsave(&tasklist_lock, flags);
                do_each_thread(g, t) {
@@ -595,7 +602,6 @@ void syscall_regfunc(void)
                read_unlock_irqrestore(&tasklist_lock, flags);
        }
        sys_tracepoint_refcount++;
-       mutex_unlock(&regfunc_mutex);
 }
 
 void syscall_unregfunc(void)
@@ -603,7 +609,6 @@ void syscall_unregfunc(void)
        unsigned long flags;
        struct task_struct *g, *t;
 
-       mutex_lock(&regfunc_mutex);
        sys_tracepoint_refcount--;
        if (!sys_tracepoint_refcount) {
                read_lock_irqsave(&tasklist_lock, flags);
@@ -612,6 +617,5 @@ void syscall_unregfunc(void)
                } while_each_thread(g, t);
                read_unlock_irqrestore(&tasklist_lock, flags);
        }
-       mutex_unlock(&regfunc_mutex);
 }
 #endif