Messages in this thread | | | Date | Thu, 23 Jul 2015 14:10:39 -0400 | From | Steven Rostedt <> | Subject | Re: [RFC PATCH] tools lib traceevent: Allow setting an alternative symbol resolver |
| |
On Thu, 23 Jul 2015 14:25:54 -0300 Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
> diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c > index cc25f059ab3d..2750e7e7efff 100644 > --- a/tools/lib/traceevent/event-parse.c > +++ b/tools/lib/traceevent/event-parse.c > @@ -418,7 +418,7 @@ static int func_map_init(struct pevent *pevent) > } > > static struct func_map * > -find_func(struct pevent *pevent, unsigned long long addr) > +__find_func(struct pevent *pevent, unsigned long long addr) > { > struct func_map *func; > struct func_map key; > @@ -434,6 +434,51 @@ find_func(struct pevent *pevent, unsigned long long addr) > return func; > } > > +static struct { > + pevent_function_resolver_t *function; > + void *priv; > +} function_resolver; > + > +/** > + * pevent_set_function_resolver - set an alternative function resolver > + * @resolver - function to be used > + * @priv - resolver function private state. > + * > + * Some tools may have already a way to resolve kernel functions, allow them > + * to keep using it instead of duplicating all the entries inside pevent->funclist. > + */ > +void pevent_set_function_resolver(pevent_function_resolver_t *resolver, void *priv) > +{ > + function_resolver.function = resolver; > + function_resolver.priv = priv;
What about passing in pevent, and making the allocation here?
-- Steve
> +} > + > +static struct func_map * > +find_func(struct pevent *pevent, unsigned long long addr) > +{ > + struct func_map *map; > + > + if (!function_resolver.function) > + return __find_func(pevent, addr); > + > + if (pevent->func_map_resolver == NULL) { > + pevent->func_map_resolver = malloc(sizeof(*map)); > + if (pevent->func_map_resolver == NULL) { > + do_warning("Not enough memory for resolving addresses to functions!\n"); > + return NULL; > + } > + } > + > + map = pevent->func_map_resolver; > + map->mod = NULL; > + map->addr = addr; > + map->func = function_resolver.function(function_resolver.priv, &map->addr, &map->mod); > + if (map->func == NULL) > + return NULL; > + > + return map; > +} > + > /** > * pevent_find_function - find a function by a given address > * @pevent: handle for the pevent > @@ -6564,6 +6609,7 @@ void pevent_free(struct pevent *pevent) > free(pevent->trace_clock); > free(pevent->events); > free(pevent->sort_events); > + free(pevent->func_map_resolver); > > free(pevent); > } > diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h > index 063b1971eb35..6bd526f0d17a 100644 > --- a/tools/lib/traceevent/event-parse.h > +++ b/tools/lib/traceevent/event-parse.h > @@ -481,6 +481,7 @@ struct pevent { > int cmdline_count; > > struct func_map *func_map; > + struct func_map *func_map_resolver; > struct func_list *funclist; > unsigned int func_count; > > @@ -611,6 +612,10 @@ enum trace_flag_type { > TRACE_FLAG_SOFTIRQ = 0x10, > }; > > +typedef char *(pevent_function_resolver_t)(void *priv, unsigned long long *addrp, char **modp); > + > +void pevent_set_function_resolver(pevent_function_resolver_t *resolver, void *priv); > + > int pevent_register_comm(struct pevent *pevent, const char *comm, int pid); > int pevent_register_trace_clock(struct pevent *pevent, const char *trace_clock); > int pevent_register_function(struct pevent *pevent, char *name, >
| |