static void tracing_stop_function_trace(void)
{
ftrace_function_enabled = 0;
- /* OK if they are not registered */
- unregister_ftrace_function(&trace_stack_ops);
- unregister_ftrace_function(&trace_ops);
+
+ if (func_flags.val & TRACE_FUNC_OPT_STACK)
+ unregister_ftrace_function(&trace_stack_ops);
+ else
+ unregister_ftrace_function(&trace_ops);
}
static int func_set_flag(u32 old_flags, u32 bit, int set)
.init = function_trace_init,
.reset = function_trace_reset,
.start = function_trace_start,
+ .wait_pipe = poll_wait_pipe,
.flags = &func_flags,
.set_flag = func_set_flag,
#ifdef CONFIG_FTRACE_SELFTEST
static int
ftrace_trace_onoff_print(struct seq_file *m, unsigned long ip,
- struct ftrace_hook_ops *ops, void *data);
+ struct ftrace_probe_ops *ops, void *data);
-static struct ftrace_hook_ops traceon_hook_ops = {
+static struct ftrace_probe_ops traceon_probe_ops = {
.func = ftrace_traceon,
.print = ftrace_trace_onoff_print,
};
-static struct ftrace_hook_ops traceoff_hook_ops = {
+static struct ftrace_probe_ops traceoff_probe_ops = {
.func = ftrace_traceoff,
.print = ftrace_trace_onoff_print,
};
static int
ftrace_trace_onoff_print(struct seq_file *m, unsigned long ip,
- struct ftrace_hook_ops *ops, void *data)
+ struct ftrace_probe_ops *ops, void *data)
{
char str[KSYM_SYMBOL_LEN];
long count = (long)data;
kallsyms_lookup(ip, NULL, NULL, NULL, str);
seq_printf(m, "%s:", str);
- if (ops == &traceon_hook_ops)
+ if (ops == &traceon_probe_ops)
seq_printf(m, "traceon");
else
seq_printf(m, "traceoff");
- if (count != -1)
+ if (count == -1)
+ seq_printf(m, ":unlimited\n");
+ else
seq_printf(m, ":count=%ld", count);
seq_putc(m, '\n');
static int
ftrace_trace_onoff_unreg(char *glob, char *cmd, char *param)
{
- struct ftrace_hook_ops *ops;
+ struct ftrace_probe_ops *ops;
/* we register both traceon and traceoff to this callback */
if (strcmp(cmd, "traceon") == 0)
- ops = &traceon_hook_ops;
+ ops = &traceon_probe_ops;
else
- ops = &traceoff_hook_ops;
+ ops = &traceoff_probe_ops;
- unregister_ftrace_function_hook_func(glob, ops);
+ unregister_ftrace_function_probe_func(glob, ops);
return 0;
}
static int
ftrace_trace_onoff_callback(char *glob, char *cmd, char *param, int enable)
{
- struct ftrace_hook_ops *ops;
+ struct ftrace_probe_ops *ops;
void *count = (void *)-1;
char *number;
int ret;
/* we register both traceon and traceoff to this callback */
if (strcmp(cmd, "traceon") == 0)
- ops = &traceon_hook_ops;
+ ops = &traceon_probe_ops;
else
- ops = &traceoff_hook_ops;
+ ops = &traceoff_probe_ops;
if (!param)
goto out_reg;
return ret;
out_reg:
- ret = register_ftrace_function_hook(glob, ops, count);
+ ret = register_ftrace_function_probe(glob, ops, count);
return ret;
}
init_func_cmd_traceon();
return register_tracer(&function_trace);
}
-
device_initcall(init_function_trace);