On Wed, 18 Sep 2019 16:34:07 +0300 Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> wrote: > There are no in-kernel %p[fF] users left. Convert the traceevent tool, > too, to align with the kernel. > > Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> > Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> > Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > Cc: Tzvetomir Stoyanov <tstoyanov@xxxxxxxxxx> > Cc: linux-trace-devel@xxxxxxxxxxxxxxx > Cc: Jiri Olsa <jolsa@xxxxxxxxxx> > Cc: Namhyung Kim <namhyung@xxxxxxxxxx> > --- > .../Documentation/libtraceevent-func_apis.txt | 10 +++++----- > tools/lib/traceevent/event-parse.c | 18 ++++++++++++++---- > 2 files changed, 19 insertions(+), 9 deletions(-) > > diff --git a/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt b/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt > index 38bfea30a5f64..f6aca0df2151a 100644 > --- a/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt > +++ b/tools/lib/traceevent/Documentation/libtraceevent-func_apis.txt > @@ -59,12 +59,12 @@ parser context. > > The _tep_register_function()_ function registers a function name mapped to an > address and (optional) module. This mapping is used in case the function tracer > -or events have "%pF" or "%pS" parameter in its format string. It is common to > -pass in the kallsyms function names with their corresponding addresses with this > +or events have "%pS" parameter in its format string. It is common to pass in > +the kallsyms function names with their corresponding addresses with this > function. The _tep_ argument is the trace event parser context. The _name_ is > -the name of the function, the string is copied internally. The _addr_ is > -the start address of the function. The _mod_ is the kernel module > -the function may be in (NULL for none). > +the name of the function, the string is copied internally. The _addr_ is the > +start address of the function. The _mod_ is the kernel module the function may > +be in (NULL for none). > > The _tep_register_print_string()_ function registers a string by the address > it was stored in the kernel. Some strings internal to the kernel with static > diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c > index b36b536a9fcba..2189621b616bc 100644 > --- a/tools/lib/traceevent/event-parse.c > +++ b/tools/lib/traceevent/event-parse.c > @@ -4335,10 +4335,20 @@ static struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, s > switch (*ptr) { > case 's': > case 'S': > - case 'f': > - case 'F': > case 'x': > break; > + case 'f': > + case 'F': > + /* > + * Pre-5.5 kernels use %pf and > + * %pF for printing symbols > + * while kernels since 5.5 use > + * %pfw for fwnodes. So check > + * %p[fF] isn't followed by 'w'. > + */ Acked-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> -- Steve > + if (ptr[1] != 'w') > + break; > + /* fall through */ > default: > /* > * Older kernels do not process > @@ -4455,12 +4465,12 @@ get_bprint_format(void *data, int size __maybe_unused, > > printk = find_printk(tep, addr); > if (!printk) { > - if (asprintf(&format, "%%pf: (NO FORMAT FOUND at %llx)\n", addr) < 0) > + if (asprintf(&format, "%%ps: (NO FORMAT FOUND at %llx)\n", addr) < 0) > return NULL; > return format; > } > > - if (asprintf(&format, "%s: %s", "%pf", printk->printk) < 0) > + if (asprintf(&format, "%s: %s", "%ps", printk->printk) < 0) > return NULL; > > return format;