Ping. I think this will be useful in avoiding problems like https://bugzilla.kernel.org/show_bug.cgi?id=205643 -- Tzvetomir (Ceco) Stoyanov VMware Open Source Technology Center On Mon, Oct 7, 2019 at 2:49 PM Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> wrote: > > When a development version of trace-cmd is built and run on the machine, > by default it loads only installed plugins, from system directories. > Thus, the development plugins will not be loaded. To simplify the development > process, a new logic is added: > At plugins load time, check the location of trace-cmd application and look > for "plugins" directory around it. If found, load plugins from it. Those > plugins will be loaded last, so in case of duplication the "development" > plugins win. > A two new APIs are introduced to libtraceevent, in order to accomplish this > logic: > tep_load_plugins_dir() - loads tep plugins from a specific directory. > tep_plugins_append() - Append two plugin lists. > > Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> > --- > include/trace-cmd/trace-cmd.h | 2 ++ > lib/trace-cmd/trace-input.c | 7 +----- > lib/trace-cmd/trace-util.c | 42 +++++++++++++++++++++++++++++++++++ > tracecmd/trace-check-events.c | 7 +----- > tracecmd/trace-list.c | 14 ++---------- > 5 files changed, 48 insertions(+), 24 deletions(-) > > diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h > index 4090eba..d1aaef8 100644 > --- a/include/trace-cmd/trace-cmd.h > +++ b/include/trace-cmd/trace-cmd.h > @@ -24,6 +24,8 @@ void tracecmd_parse_ftrace_printk(struct tep_handle *pevent, char *file, unsigne > extern int tracecmd_disable_sys_plugins; > extern int tracecmd_disable_plugins; > > +struct tep_plugin_list *trace_load_plugins(struct tep_handle *tep); > + > char **tracecmd_event_systems(const char *tracing_dir); > char **tracecmd_system_events(const char *tracing_dir, const char *system); > struct tep_handle *tracecmd_local_events(const char *tracing_dir); > diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c > index 6102eb3..28da455 100644 > --- a/lib/trace-cmd/trace-input.c > +++ b/lib/trace-cmd/trace-input.c > @@ -2886,15 +2886,10 @@ struct tracecmd_input *tracecmd_alloc_fd(int fd) > if (!handle->pevent) > goto failed_read; > > - if (tracecmd_disable_plugins) > - tep_set_flag(handle->pevent, TEP_DISABLE_PLUGINS); > - if (tracecmd_disable_sys_plugins) > - tep_set_flag(handle->pevent, TEP_DISABLE_SYS_PLUGINS); > - > /* register default ftrace functions first */ > tracecmd_ftrace_overrides(handle, &handle->finfo); > > - handle->plugin_list = tep_load_plugins(handle->pevent); > + 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()); > diff --git a/lib/trace-cmd/trace-util.c b/lib/trace-cmd/trace-util.c > index 8aa3b6c..690a135 100644 > --- a/lib/trace-cmd/trace-util.c > +++ b/lib/trace-cmd/trace-util.c > @@ -860,6 +860,48 @@ void trace_util_free_plugin_files(char **files) > free(files); > } > > +static char *get_source_plugins_dir(void) > +{ > + char *p, path[PATH_MAX+1]; > + int ret; > + > + ret = readlink("/proc/self/exe", path, PATH_MAX); > + if (ret > PATH_MAX || ret < 0) > + return NULL; > + > + dirname(path); > + p = strrchr(path, '/'); > + if (!p) > + return NULL; > + /* Check if we are in the the source tree */ > + if (strcmp(p, "/tracecmd") != 0) > + return NULL; > + > + strcpy(p, "/lib/traceevent/plugins"); > + return strdup(path); > +} > + > +struct tep_plugin_list* > +trace_load_plugins(struct tep_handle *tep) > +{ > + struct tep_plugin_list *list; > + char *path; > + > + if (tracecmd_disable_plugins) > + tep_set_flag(tep, TEP_DISABLE_PLUGINS); > + if (tracecmd_disable_sys_plugins) > + tep_set_flag(tep, TEP_DISABLE_SYS_PLUGINS); > + > + path = get_source_plugins_dir(); > + if (path) > + tep_add_plugin_path(tep, path, TEP_PLUGIN_LAST); > + free(path); > + > + list = tep_load_plugins(tep); > + > + return list; > +} > + > char *tracecmd_get_tracing_file(const char *name) > { > static const char *tracing; > diff --git a/tracecmd/trace-check-events.c b/tracecmd/trace-check-events.c > index b09fcd0..ffaae27 100644 > --- a/tracecmd/trace-check-events.c > +++ b/tracecmd/trace-check-events.c > @@ -43,12 +43,7 @@ void trace_check_events(int argc, char **argv) > if (!pevent) > exit(EINVAL); > > - if (tracecmd_disable_plugins) > - tep_set_flag(pevent, TEP_DISABLE_PLUGINS); > - if (tracecmd_disable_sys_plugins) > - tep_set_flag(pevent, TEP_DISABLE_SYS_PLUGINS); > - > - list = tep_load_plugins(pevent); > + list = trace_load_plugins(pevent); > ret = tracecmd_fill_local_events(tracing, pevent, &parsing_failures); > if (ret || parsing_failures) > ret = EINVAL; > diff --git a/tracecmd/trace-list.c b/tracecmd/trace-list.c > index 65099a5..6b59117 100644 > --- a/tracecmd/trace-list.c > +++ b/tracecmd/trace-list.c > @@ -317,14 +317,9 @@ static void show_plugin_options(void) > if (!pevent) > die("Can not allocate pevent\n"); > > - if (tracecmd_disable_plugins) > - tep_set_flag(pevent, TEP_DISABLE_PLUGINS); > - if (tracecmd_disable_sys_plugins) > - tep_set_flag(pevent, TEP_DISABLE_SYS_PLUGINS); > - > trace_seq_init(&s); > > - list = tep_load_plugins(pevent); > + list = trace_load_plugins(pevent); > tep_plugin_print_options(&s); > trace_seq_do_printf(&s); > tep_unload_plugins(list, pevent); > @@ -348,14 +343,9 @@ static void show_plugins(void) > if (!pevent) > die("Can not allocate pevent\n"); > > - if (tracecmd_disable_plugins) > - tep_set_flag(pevent, TEP_DISABLE_PLUGINS); > - if (tracecmd_disable_sys_plugins) > - tep_set_flag(pevent, TEP_DISABLE_SYS_PLUGINS); > - > trace_seq_init(&s); > > - list = tep_load_plugins(pevent); > + list = trace_load_plugins(pevent); > tep_print_plugins(&s, " ", "\n", list); > > trace_seq_do_printf(&s); > -- > 2.21.0 > -- Tzvetomir (Ceco) Stoyanov VMware Open Source Technology Center
![]() |