|
@@ -367,9 +367,6 @@ static int remove_ftrace_list_ops(struct ftrace_ops **list,
|
|
|
|
|
|
static int __register_ftrace_function(struct ftrace_ops *ops)
|
|
|
{
|
|
|
- if (unlikely(ftrace_disabled))
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
if (FTRACE_WARN_ON(ops == &global_ops))
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -428,9 +425,6 @@ static int __unregister_ftrace_function(struct ftrace_ops *ops)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- if (ftrace_disabled)
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
if (WARN_ON(!(ops->flags & FTRACE_OPS_FL_ENABLED)))
|
|
|
return -EBUSY;
|
|
|
|
|
@@ -2088,10 +2082,15 @@ static void ftrace_startup_enable(int command)
|
|
|
static int ftrace_startup(struct ftrace_ops *ops, int command)
|
|
|
{
|
|
|
bool hash_enable = true;
|
|
|
+ int ret;
|
|
|
|
|
|
if (unlikely(ftrace_disabled))
|
|
|
return -ENODEV;
|
|
|
|
|
|
+ ret = __register_ftrace_function(ops);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
ftrace_start_up++;
|
|
|
command |= FTRACE_UPDATE_CALLS;
|
|
|
|
|
@@ -2113,12 +2112,17 @@ static int ftrace_startup(struct ftrace_ops *ops, int command)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void ftrace_shutdown(struct ftrace_ops *ops, int command)
|
|
|
+static int ftrace_shutdown(struct ftrace_ops *ops, int command)
|
|
|
{
|
|
|
bool hash_disable = true;
|
|
|
+ int ret;
|
|
|
|
|
|
if (unlikely(ftrace_disabled))
|
|
|
- return;
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ ret = __unregister_ftrace_function(ops);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
ftrace_start_up--;
|
|
|
/*
|
|
@@ -2153,9 +2157,10 @@ static void ftrace_shutdown(struct ftrace_ops *ops, int command)
|
|
|
}
|
|
|
|
|
|
if (!command || !ftrace_enabled)
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
ftrace_run_update_code(command);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void ftrace_startup_sysctl(void)
|
|
@@ -3060,16 +3065,13 @@ static void __enable_ftrace_function_probe(void)
|
|
|
if (i == FTRACE_FUNC_HASHSIZE)
|
|
|
return;
|
|
|
|
|
|
- ret = __register_ftrace_function(&trace_probe_ops);
|
|
|
- if (!ret)
|
|
|
- ret = ftrace_startup(&trace_probe_ops, 0);
|
|
|
+ ret = ftrace_startup(&trace_probe_ops, 0);
|
|
|
|
|
|
ftrace_probe_registered = 1;
|
|
|
}
|
|
|
|
|
|
static void __disable_ftrace_function_probe(void)
|
|
|
{
|
|
|
- int ret;
|
|
|
int i;
|
|
|
|
|
|
if (!ftrace_probe_registered)
|
|
@@ -3082,9 +3084,7 @@ static void __disable_ftrace_function_probe(void)
|
|
|
}
|
|
|
|
|
|
/* no more funcs left */
|
|
|
- ret = __unregister_ftrace_function(&trace_probe_ops);
|
|
|
- if (!ret)
|
|
|
- ftrace_shutdown(&trace_probe_ops, 0);
|
|
|
+ ftrace_shutdown(&trace_probe_ops, 0);
|
|
|
|
|
|
ftrace_probe_registered = 0;
|
|
|
}
|
|
@@ -4366,12 +4366,15 @@ core_initcall(ftrace_nodyn_init);
|
|
|
static inline int ftrace_init_dyn_debugfs(struct dentry *d_tracer) { return 0; }
|
|
|
static inline void ftrace_startup_enable(int command) { }
|
|
|
/* Keep as macros so we do not need to define the commands */
|
|
|
-# define ftrace_startup(ops, command) \
|
|
|
- ({ \
|
|
|
- (ops)->flags |= FTRACE_OPS_FL_ENABLED; \
|
|
|
- 0; \
|
|
|
+# define ftrace_startup(ops, command) \
|
|
|
+ ({ \
|
|
|
+ int ___ret = __register_ftrace_function(ops); \
|
|
|
+ if (!___ret) \
|
|
|
+ (ops)->flags |= FTRACE_OPS_FL_ENABLED; \
|
|
|
+ ___ret; \
|
|
|
})
|
|
|
-# define ftrace_shutdown(ops, command) do { } while (0)
|
|
|
+# define ftrace_shutdown(ops, command) __unregister_ftrace_function(ops)
|
|
|
+
|
|
|
# define ftrace_startup_sysctl() do { } while (0)
|
|
|
# define ftrace_shutdown_sysctl() do { } while (0)
|
|
|
|
|
@@ -4780,9 +4783,7 @@ int register_ftrace_function(struct ftrace_ops *ops)
|
|
|
|
|
|
mutex_lock(&ftrace_lock);
|
|
|
|
|
|
- ret = __register_ftrace_function(ops);
|
|
|
- if (!ret)
|
|
|
- ret = ftrace_startup(ops, 0);
|
|
|
+ ret = ftrace_startup(ops, 0);
|
|
|
|
|
|
mutex_unlock(&ftrace_lock);
|
|
|
|
|
@@ -4801,9 +4802,7 @@ int unregister_ftrace_function(struct ftrace_ops *ops)
|
|
|
int ret;
|
|
|
|
|
|
mutex_lock(&ftrace_lock);
|
|
|
- ret = __unregister_ftrace_function(ops);
|
|
|
- if (!ret)
|
|
|
- ftrace_shutdown(ops, 0);
|
|
|
+ ret = ftrace_shutdown(ops, 0);
|
|
|
mutex_unlock(&ftrace_lock);
|
|
|
|
|
|
return ret;
|
|
@@ -4997,6 +4996,13 @@ ftrace_suspend_notifier_call(struct notifier_block *bl, unsigned long state,
|
|
|
return NOTIFY_DONE;
|
|
|
}
|
|
|
|
|
|
+/* Just a place holder for function graph */
|
|
|
+static struct ftrace_ops fgraph_ops __read_mostly = {
|
|
|
+ .func = ftrace_stub,
|
|
|
+ .flags = FTRACE_OPS_FL_STUB | FTRACE_OPS_FL_GLOBAL |
|
|
|
+ FTRACE_OPS_FL_RECURSION_SAFE,
|
|
|
+};
|
|
|
+
|
|
|
int register_ftrace_graph(trace_func_graph_ret_t retfunc,
|
|
|
trace_func_graph_ent_t entryfunc)
|
|
|
{
|
|
@@ -5023,7 +5029,7 @@ int register_ftrace_graph(trace_func_graph_ret_t retfunc,
|
|
|
ftrace_graph_return = retfunc;
|
|
|
ftrace_graph_entry = entryfunc;
|
|
|
|
|
|
- ret = ftrace_startup(&global_ops, FTRACE_START_FUNC_RET);
|
|
|
+ ret = ftrace_startup(&fgraph_ops, FTRACE_START_FUNC_RET);
|
|
|
|
|
|
out:
|
|
|
mutex_unlock(&ftrace_lock);
|
|
@@ -5040,7 +5046,7 @@ void unregister_ftrace_graph(void)
|
|
|
ftrace_graph_active--;
|
|
|
ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub;
|
|
|
ftrace_graph_entry = ftrace_graph_entry_stub;
|
|
|
- ftrace_shutdown(&global_ops, FTRACE_STOP_FUNC_RET);
|
|
|
+ ftrace_shutdown(&fgraph_ops, FTRACE_STOP_FUNC_RET);
|
|
|
unregister_pm_notifier(&ftrace_suspend_notifier);
|
|
|
unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL);
|
|
|
|