Tzvetomir, >From bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=211255 It was reported that: $ trace-cmd report -N -r funcgraph_exit trace.dat 2>/dev/null | grep funcgraph_exit | wc -l 11645 $ trace-cmd report -N -F funcgraph_exit -r funcgraph_exit trace.dat 2>/dev/null | grep funcgraph_exit | wc -l 24826 Where the first should have been as big as the second. The problem with the above is really that "-N" does not stop the ftrace function event plugins from being loaded. Looking at this further, I think it's a mistake to have the plugins loaded at opening time. We should have a new function for the library: int tracecmd_load_plugins(struct tracecmd_handle *handle, int flags); And this should be called after read_trace_header() in trace-read.c. We can still have tracecmd_open_head() call this, as the "open_head" is basically a "do everything" function. This will allow us to remove the global "tracecmd_disable_plugins" and "tracecmd_disable_sys_plugins" variables and use the flags input instead. With the '-N' option, we should probably just skip calling it regardless. The below patch was just a POC, to see if there was any side-effects for this. But it didn't have a return value or flags, which should be added for the final version. -- Steve diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c index 3e67dd61..11bf8e5d 100644 --- a/lib/trace-cmd/trace-input.c +++ b/lib/trace-cmd/trace-input.c @@ -3247,11 +3247,6 @@ struct tracecmd_input *tracecmd_alloc_fd(int fd) if (!handle->pevent) goto failed_read; - /* register default ftrace functions first */ - tracecmd_ftrace_overrides(handle, &handle->finfo); - - handle->plugin_list = trace_load_plugins(handle->pevent); - tep_set_file_bigendian(handle->pevent, buf[0]); tep_set_local_bigendian(handle->pevent, tracecmd_host_bigendian()); @@ -3344,6 +3339,13 @@ struct tracecmd_input *tracecmd_open(const char *file) return tracecmd_open_fd(fd); } +void tracecmd_load_plugins(struct tracecmd_input *handle) +{ + /* register default ftrace functions first */ + tracecmd_ftrace_overrides(handle, &handle->finfo); + handle->plugin_list = trace_load_plugins(handle->pevent); +} + /** * tracecmd_open_head - create a tracecmd_handle from a given file, read * and parse only the trace headers from the file diff --git a/tracecmd/trace-read.c b/tracecmd/trace-read.c index d07f4efe..a79bf0aa 100644 --- a/tracecmd/trace-read.c +++ b/tracecmd/trace-read.c @@ -1768,10 +1768,14 @@ void trace_report (int argc, char **argv) die("Wakeup tracing can only be done on a single input file"); list_for_each_entry(inputs, &input_files, list) { + void tracecmd_load_plugins(struct tracecmd_input *handle); handle = read_trace_header(inputs->file); if (!handle) die("error reading header for %s", inputs->file); + if (!tracecmd_disable_plugins) + tracecmd_load_plugins(handle); + /* If used with instances, top instance will have no tag */ add_handle(handle, multi_inputs ? inputs->file : NULL);