diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2016-02-09 23:14:45 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2016-02-10 13:39:26 -0500 |
commit | 0b232821c7baf69e9d9cbcbb6a04760852b68da5 (patch) | |
tree | 75c51bf92a7ff8d473e6525fce42f82e871bee73 | |
parent | bcbd60c123e07c92032d71345dd9ec36bf4713c7 (diff) | |
download | trace-cmd-0b232821c7baf69e9d9cbcbb6a04760852b68da5.tar.gz |
trace-cmd: Have -n add to set_graph_notrace if function_graph tracer
When doing function_graph tracing, have the -n not do the call trace
of the listed functions, instead of just skipping the specific functions
but still tracing the children of those functions.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | trace-record.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/trace-record.c b/trace-record.c index bbd4c4a3..84e311fb 100644 --- a/trace-record.c +++ b/trace-record.c @@ -2955,13 +2955,16 @@ static void record_data(char *date2ts) tracecmd_output_close(handle); } -static void write_func_file(struct buffer_instance *instance, +static int write_func_file(struct buffer_instance *instance, const char *file, struct func_list **list) { struct func_list *item; char *path; int fd; - int ret; + int ret = -1; + + if (!*list) + return 0; path = get_instance_file(instance, file); @@ -2981,15 +2984,16 @@ static void write_func_file(struct buffer_instance *instance, free(item); } close(fd); - + ret = 0; free: tracecmd_put_tracing_file(path); - return; + return ret; failed: die("Failed to write %s to %s.\n" "Perhaps this function is not available for tracing.\n" "run 'trace-cmd list -f %s' to see if it is.", item->func, file, item->func); + return ret; } static int functions_filtered(struct buffer_instance *instance) @@ -3024,11 +3028,32 @@ static int functions_filtered(struct buffer_instance *instance) static void set_funcs(struct buffer_instance *instance) { - write_func_file(instance, "set_ftrace_filter", &instance->filter_funcs); - write_func_file(instance, "set_ftrace_notrace", &instance->notrace_funcs); + int set_notrace = 0; + int ret; + + ret = write_func_file(instance, "set_ftrace_filter", &instance->filter_funcs); + if (ret < 0) + die("set_ftrace_filter does not exist. Can not filter functions"); + /* graph tracing currently only works for top instance */ - if (is_top_instance(instance)) - write_func_file(instance, "set_graph_function", &graph_funcs); + if (is_top_instance(instance)) { + ret = write_func_file(instance, "set_graph_function", &graph_funcs); + if (ret < 0) + die("set_graph_function does not exist."); + if (instance->plugin && strcmp(instance->plugin, "function_graph") == 0) { + ret = write_func_file(instance, "set_graph_notrace", + &instance->notrace_funcs); + if (!ret) + set_notrace = 1; + } + if (!set_notrace) { + ret = write_func_file(instance, "set_ftrace_notrace", + &instance->notrace_funcs); + if (ret < 0) + die("set_ftrace_notrace does not exist. Can not filter functions"); + } + } else + write_func_file(instance, "set_ftrace_notrace", &instance->notrace_funcs); /* make sure we are filtering functions */ if (func_stack && is_top_instance(instance)) { |