Messages in this thread |  | | Date | Fri, 17 Jun 2016 12:17:36 -0400 | From | Steven Rostedt <> | Subject | Re: [RFC/PATCH] perf: Add sizeof operator support |
| |
On Tue, 14 Jun 2016 11:38:32 -0500 Jeremy Linton <jeremy.linton@arm.com> wrote:
> There are a fair number of tracepoints in the kernel making > use of the sizeof operator. Allow perf to understand some of > those cases, and report a more informative error message for > the ones it cannot understand. > > Signed-off-by: Jeremy Linton <jeremy.linton@arm.com> > --- > > So this is as much a RFC as a patch because the use of sizeof > seems to extend to structures, pointers, etc that aren't easy > to deduce from userspace. I'm not sure what the correct solution > should be in those cases. > > tools/lib/traceevent/event-parse.c | 46 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > > diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c > index a8b6357..5813248 100644 > --- a/tools/lib/traceevent/event-parse.c > +++ b/tools/lib/traceevent/event-parse.c > @@ -31,6 +31,8 @@ > #include <errno.h> > #include <stdint.h> > #include <limits.h> > +#include <linux/kernel.h> > +#include <linux/types.h> > > #include <netinet/ip6.h> > #include "event-parse.h" > @@ -2868,6 +2870,46 @@ process_str(struct event_format *event __maybe_unused, struct print_arg *arg, > } > > static enum event_type > +process_sizeof(struct event_format *event __maybe_unused, struct print_arg *arg, > + char **tok) > +{ > + char *token; > + char *atom; > + > + if (process_paren(event, arg, &token) < 0) > + goto out_free; > + > + atom = arg->atom.atom; > + if (arg->type != PRINT_ATOM) { > + do_warning_event(event, "didn't understand %s for sizeof\n", > + token); > + goto out_free_atom; > + } > + > + if (strcmp(token, "__u64") == 0) { > + if (asprintf(&arg->atom.atom, "%zd", sizeof(__u64)) < 0) > + goto out_free_atom; > + } else if (strcmp(token, "__u32") == 0) { > + if (asprintf(&arg->atom.atom, "%zd", sizeof(__u32)) < 0) > + goto out_free_atom;
What events are doing sizeof(__u64) and sizeof(__u32)?
First, that's useless, as sizeof(__u64) will always be 8, and sizeof(__u32) will always be 4.
What exactly is this fixing?
-- Steve
> + } else { > + do_warning_event(event, "unknown sizeof %s\n", token); > + goto out_free_atom; > + } > + > + free(atom); > + *tok = token; > + return EVENT_DELIM; > + > + out_free_atom: > + free_token(atom); > + out_free: > + free_token(token); > + *tok = NULL; > + return EVENT_ERROR; > +} > + > +static enum event_type > process_bitmask(struct event_format *event __maybe_unused, struct print_arg *arg, > char **tok) > { > @@ -3026,6 +3068,10 @@ process_function(struct event_format *event, struct print_arg *arg, > free_token(token); > return process_dynamic_array_len(event, arg, tok); > } > + if (strcmp(token, "sizeof") == 0) { > + free_token(token); > + return process_sizeof(event, arg, tok); > + } > > func = find_func_handler(event->pevent, token); > if (func) {
|  |