ftrace: Have unregister_ftrace_function_probe_func() return a value
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Tue, 4 Apr 2017 20:44:43 +0000 (16:44 -0400)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 21 Apr 2017 02:06:42 +0000 (22:06 -0400)
Currently unregister_ftrace_function_probe_func() is a void function. It
does not give any feedback if an error occurred or no item was found to
remove and nothing was done.

Change it to return status and success if it removed something. Also update
the callers to return that feedback to the user.

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
kernel/trace/ftrace.c
kernel/trace/trace.c
kernel/trace/trace.h
kernel/trace/trace_events.c
kernel/trace/trace_functions.c

index 5c8d8eea9e7c8ab10bb10f07386c855ad063db36..cbae7fb1be155319138c45e7483e866375322a10 100644 (file)
@@ -4102,7 +4102,7 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
        return count;
 }
 
-void
+int
 unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops)
 {
        struct ftrace_ops_hash old_hash_ops;
@@ -4131,7 +4131,7 @@ unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops)
 
                /* we do not support '!' for function probes */
                if (WARN_ON(not))
-                       return;
+                       return -EINVAL;
        }
 
        mutex_lock(&trace_probe_ops.func_hash->regex_lock);
@@ -4140,9 +4140,9 @@ unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops)
        /* Probes only have filters */
        old_hash_ops.notrace_hash = NULL;
 
+       ret = -ENOMEM;
        hash = alloc_and_copy_ftrace_hash(FTRACE_HASH_DEFAULT_BITS, *orig_hash);
        if (!hash)
-               /* Hmm, should report this somehow */
                goto out_unlock;
 
        INIT_LIST_HEAD(&free_list);
@@ -4173,6 +4173,13 @@ unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops)
                        list_add(&entry->free_list, &free_list);
                }
        }
+
+       /* Nothing found? */
+       if (list_empty(&free_list)) {
+               ret = -EINVAL;
+               goto out_unlock;
+       }
+
        mutex_lock(&ftrace_lock);
        disabled = __disable_ftrace_function_probe();
        /*
@@ -4198,6 +4205,7 @@ unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops)
  out_unlock:
        mutex_unlock(&trace_probe_ops.func_hash->regex_lock);
        free_ftrace_hash(hash);
+       return ret;
 }
 
 static LIST_HEAD(ftrace_commands);
index 7a4d578d888776b536d016fbbf62edb1e547b0f4..64a4418a51065493d7e24902b8c9cd4a25f97f29 100644 (file)
@@ -6829,10 +6829,8 @@ ftrace_trace_snapshot_callback(struct ftrace_hash *hash,
 
        ops = param ? &snapshot_count_probe_ops :  &snapshot_probe_ops;
 
-       if (glob[0] == '!') {
-               unregister_ftrace_function_probe_func(glob+1, ops);
-               return 0;
-       }
+       if (glob[0] == '!')
+               return unregister_ftrace_function_probe_func(glob+1, ops);
 
        if (!param)
                goto out_reg;
index 86aa5a2222bafe300931f16cab35e01a7466b4a3..31d80bff9ee65d7518faababe7022a06b900a6c8 100644 (file)
@@ -963,7 +963,7 @@ void free_ftrace_func_mapper(struct ftrace_func_mapper *mapper,
 extern int
 register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
                              void *data);
-extern void
+extern int
 unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops);
 
 int register_ftrace_command(struct ftrace_func_command *cmd);
index 37902107c44f5c6053e63c482c2bc0a0b5536e42..9e07a5b3869b276045be3547aa791dd294da42f2 100644 (file)
@@ -2652,8 +2652,7 @@ event_enable_func(struct ftrace_hash *hash,
                ops = param ? &event_disable_count_probe_ops : &event_disable_probe_ops;
 
        if (glob[0] == '!') {
-               unregister_ftrace_function_probe_func(glob+1, ops);
-               ret = 0;
+               ret = unregister_ftrace_function_probe_func(glob+1, ops);
                goto out;
        }
 
index 56d0fe1e4ea10113a721409d9d95f531974a0420..dcb4d37ed4bde69c5fdfac3f21bd63978b23d977 100644 (file)
@@ -586,10 +586,8 @@ ftrace_trace_probe_callback(struct ftrace_probe_ops *ops,
        if (!enable)
                return -EINVAL;
 
-       if (glob[0] == '!') {
-               unregister_ftrace_function_probe_func(glob+1, ops);
-               return 0;
-       }
+       if (glob[0] == '!')
+               return unregister_ftrace_function_probe_func(glob+1, ops);
 
        if (!param)
                goto out_reg;