From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754853AbaESO3n (ORCPT ); Mon, 19 May 2014 10:29:43 -0400 Received: from mail-pa0-f43.google.com ([209.85.220.43]:60656 "EHLO mail-pa0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750957AbaESO3l (ORCPT ); Mon, 19 May 2014 10:29:41 -0400 Subject: Re: [PATCH 2/4] tools lib traceevent: Add options to plugins From: Namhyung Kim To: Steven Rostedt Cc: linux-kernel@vger.kernel.org, Jiri Olsa , Ingo Molnar , Andrew Morton In-Reply-To: <20140516140502.340008258@goodmis.org> References: <20140516140215.149535442@goodmis.org> <20140516140502.340008258@goodmis.org> Content-Type: text/plain; charset="UTF-8" Date: Mon, 19 May 2014 23:29:35 +0900 Message-ID: <1400509775.1742.15.camel@leonhard> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Steve, 2014-05-16 (금), 10:02 -0400, Steven Rostedt: > From: "Steven Rostedt (Red Hat)" > > The traceevent plugins allows developers to have their events print out > information that is more advanced than what can be achieved by the > trace event format files. > > As these plugins are used on the userspace side of the tracing tools, it > is only logical that the tools should be able to produce different types > of output for the events. The types of events still need to be defined by > the plugins thus we need a way to pass information from the tool to the > plugin to specify what type of information to be shown. > > Not only does the information need to be passed by the tool to plugin, but > the plugin also requires a way to notify the tool of what options it can > provide. > > This builds the plugin option infrastructure that is taken from trace-cmd > that is used to allow plugins to produce different output based on the > options specified by the tool. > > Signed-off-by: Steven Rostedt > --- > tools/lib/traceevent/event-parse.h | 16 ++- > tools/lib/traceevent/event-plugin.c | 197 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 209 insertions(+), 4 deletions(-) > > diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h > index a68ec3d8289f..d6c610a66006 100644 > --- a/tools/lib/traceevent/event-parse.h > +++ b/tools/lib/traceevent/event-parse.h > @@ -107,8 +107,8 @@ typedef int (*pevent_event_handler_func)(struct trace_seq *s, > typedef int (*pevent_plugin_load_func)(struct pevent *pevent); > typedef int (*pevent_plugin_unload_func)(struct pevent *pevent); > > -struct plugin_option { > - struct plugin_option *next; > +struct pevent_plugin_option { > + struct pevent_plugin_option *next; Hmm.. this name change reminds me that it might be better if this plugin and option list belong to a pevent.. > void *handle; > char *file; > char *name; > @@ -135,7 +135,7 @@ struct plugin_option { > * PEVENT_PLUGIN_OPTIONS: (optional) > * Plugin options that can be set before loading > * > - * struct plugin_option PEVENT_PLUGIN_OPTIONS[] = { > + * struct pevent_plugin_option PEVENT_PLUGIN_OPTIONS[] = { > * { > * .name = "option-name", > * .plugin_alias = "overide-file-name", (optional) > @@ -355,7 +355,7 @@ enum pevent_func_arg_type { > enum pevent_flag { > PEVENT_NSEC_OUTPUT = 1, /* output in NSECS */ > PEVENT_DISABLE_SYS_PLUGINS = 1 << 1, > - PEVENT_DISABLE_PLUGINS = 1 << 2, > + PEVENT_DISABLE_PLUGINS = 1 << 2 Unnecessary change? > }; > > #define PEVENT_ERRORS \ > @@ -415,6 +415,14 @@ struct plugin_list; > struct plugin_list *traceevent_load_plugins(struct pevent *pevent); > void traceevent_unload_plugins(struct plugin_list *plugin_list, > struct pevent *pevent); > +char **traceevent_plugin_list_options(void); > +void traceevent_plugin_free_options_list(char **list); > +int traceevent_plugin_add_options(const char *name, > + struct pevent_plugin_option *options); > +void traceevent_plugin_remove_options(struct pevent_plugin_option *options); > +void traceevent_print_plugins(struct trace_seq *s, > + const char *prefix, const char *suffix, > + const struct plugin_list *list); > > struct cmdline; > struct cmdline_list; > diff --git a/tools/lib/traceevent/event-plugin.c b/tools/lib/traceevent/event-plugin.c > index 317466bd1a37..a24479426d58 100644 > --- a/tools/lib/traceevent/event-plugin.c > +++ b/tools/lib/traceevent/event-plugin.c > @@ -18,6 +18,7 @@ > * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > */ > > +#include > #include > #include > #include > @@ -30,12 +31,208 @@ > > #define LOCAL_PLUGIN_DIR ".traceevent/plugins" > > +static struct registered_plugin_options { > + struct registered_plugin_options *next; > + struct pevent_plugin_option *options; > +} *registered_options; > + > +static struct trace_plugin_options { > + struct trace_plugin_options *next; > + char *plugin; > + char *option; > + char *value; > +} *trace_plugin_options; > + > struct plugin_list { > struct plugin_list *next; > char *name; > void *handle; > }; > > +/** > + * traceevent_plugin_list_options - get list of plugin options > + * > + * Returns an array of char strings that list the currently registered > + * plugin options in the format of :