|
@@ -194,9 +194,13 @@ static int tracepoint_add_func(struct tracepoint *tp,
|
|
|
struct tracepoint_func *func, int prio)
|
|
|
{
|
|
|
struct tracepoint_func *old, *tp_funcs;
|
|
|
+ int ret;
|
|
|
|
|
|
- if (tp->regfunc && !static_key_enabled(&tp->key))
|
|
|
- tp->regfunc();
|
|
|
+ if (tp->regfunc && !static_key_enabled(&tp->key)) {
|
|
|
+ ret = tp->regfunc();
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
tp_funcs = rcu_dereference_protected(tp->funcs,
|
|
|
lockdep_is_held(&tracepoints_mutex));
|
|
@@ -529,7 +533,7 @@ EXPORT_SYMBOL_GPL(for_each_kernel_tracepoint);
|
|
|
/* NB: reg/unreg are called while guarded with the tracepoints_mutex */
|
|
|
static int sys_tracepoint_refcount;
|
|
|
|
|
|
-void syscall_regfunc(void)
|
|
|
+int syscall_regfunc(void)
|
|
|
{
|
|
|
struct task_struct *p, *t;
|
|
|
|
|
@@ -541,6 +545,8 @@ void syscall_regfunc(void)
|
|
|
read_unlock(&tasklist_lock);
|
|
|
}
|
|
|
sys_tracepoint_refcount++;
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
void syscall_unregfunc(void)
|