lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAP-5=fUNR_t8R33enM1WHzR1-ZzZMUDM1hTLohPdefbKfhMSXA@mail.gmail.com>
Date: Tue, 5 Nov 2024 11:33:09 -0800
From: Ian Rogers <irogers@...gle.com>
To: Arnaldo Carvalho de Melo <acme@...nel.org>
Cc: Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>, 
	Namhyung Kim <namhyung@...nel.org>, Mark Rutland <mark.rutland@....com>, 
	Alexander Shishkin <alexander.shishkin@...ux.intel.com>, Jiri Olsa <jolsa@...nel.org>, 
	Adrian Hunter <adrian.hunter@...el.com>, Kan Liang <kan.liang@...ux.intel.com>, 
	Athira Jajeev <atrajeev@...ux.vnet.ibm.com>, James Clark <james.clark@...aro.org>, 
	Dominique Martinet <asmadeus@...ewreck.org>, Yang Li <yang.lee@...ux.alibaba.com>, 
	Colin Ian King <colin.i.king@...il.com>, Yang Jihong <yangjihong@...edance.com>, 
	"Steinar H. Gunderson" <sesse@...gle.com>, Oliver Upton <oliver.upton@...ux.dev>, 
	Ilkka Koskinen <ilkka@...amperecomputing.com>, Ze Gao <zegao2021@...il.com>, 
	Weilin Wang <weilin.wang@...el.com>, Ben Gainey <ben.gainey@....com>, 
	zhaimingbing <zhaimingbing@...s.chinamobile.com>, Zixian Cai <fzczx123@...il.com>, 
	Andi Kleen <ak@...ux.intel.com>, Paran Lee <p4ranlee@...il.com>, 
	Thomas Falcon <thomas.falcon@...el.com>, linux-kernel@...r.kernel.org, 
	linux-perf-users@...r.kernel.org, 
	"Steven Rostedt (Google)" <rostedt@...dmis.org>
Subject: Re: [PATCH v2 4/6] perf evsel: Add/use accessor for tp_format

On Tue, Nov 5, 2024 at 9:36 AM Arnaldo Carvalho de Melo <acme@...nel.org> wrote:
>
> On Sat, Nov 02, 2024 at 09:53:58AM -0700, Ian Rogers wrote:
> > Add an accessor function for tp_format. Rather than search+replace
> > uses try to use a variable and reuse it. Add additional NULL checks
> > when accessing/using the value. Make sure the PTR_ERR is nulled out on
> > error path in evsel__newtp_idx.
> >
> > Signed-off-by: Ian Rogers <irogers@...gle.com>
> > ---
> >  tools/perf/builtin-kmem.c                     | 15 ++--
> >  tools/perf/builtin-kwork.c                    |  3 +-
> >  tools/perf/builtin-script.c                   |  9 ++-
> >  tools/perf/builtin-trace.c                    | 80 +++++++++++++------
> >  tools/perf/util/data-convert-bt.c             | 10 ++-
> >  tools/perf/util/data-convert-json.c           |  8 +-
> >  tools/perf/util/evsel.c                       |  9 ++-
> >  tools/perf/util/evsel.h                       |  5 ++
> >  tools/perf/util/evsel_fprintf.c               |  4 +-
> >  .../util/scripting-engines/trace-event-perl.c |  3 +-
> >  .../scripting-engines/trace-event-python.c    |  3 +-
> >  tools/perf/util/sort.c                        | 33 +++++---
> >  tools/perf/util/trace-event-scripting.c       | 10 ++-
> >  13 files changed, 131 insertions(+), 61 deletions(-)
> >
> > diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
> > index a756147e2eec..8d9477d3f52b 100644
> > --- a/tools/perf/builtin-kmem.c
> > +++ b/tools/perf/builtin-kmem.c
> > @@ -761,6 +761,7 @@ static int parse_gfp_flags(struct evsel *evsel, struct perf_sample *sample,
> >       };
> >       struct trace_seq seq;
> >       char *str, *pos = NULL;
> > +     const struct tep_event *tp_format;
> >
> >       if (nr_gfps) {
> >               struct gfp_flag key = {
> > @@ -772,8 +773,9 @@ static int parse_gfp_flags(struct evsel *evsel, struct perf_sample *sample,
> >       }
> >
> >       trace_seq_init(&seq);
> > -     tep_print_event(evsel->tp_format->tep,
> > -                     &seq, &record, "%s", TEP_PRINT_INFO);
> > +     tp_format = evsel__tp_format(evsel);
> > +     if (tp_format)
> > +             tep_print_event(tp_format->tep, &seq, &record, "%s", TEP_PRINT_INFO);
> >
> >       str = strtok_r(seq.buffer, " ", &pos);
> >       while (str) {
> > @@ -2011,14 +2013,15 @@ int cmd_kmem(int argc, const char **argv)
> >       }
> >
> >       if (kmem_page) {
> > -             struct evsel *evsel = evlist__find_tracepoint_by_name(session->evlist, "kmem:mm_page_alloc");
> > +             struct evsel *evsel = evlist__find_tracepoint_by_name(session->evlist,
> > +                                                                   "kmem:mm_page_alloc");
>
> Try to avoid these reflows to reduce patch size, please.

Agreed, in this case check `checkpatch.pl` is complaining that the
line length is 109 columns.

> > +             const struct tep_event *tp_format = evsel ? evsel__tp_format(evsel) : NULL;
> >
> > -             if (evsel == NULL) {
> > +             if (tp_format == NULL) {
> >                       pr_err(errmsg, "page", "page");
> >                       goto out_delete;
> >               }
> > -
> > -             kmem_page_size = tep_get_page_size(evsel->tp_format->tep);
> > +             kmem_page_size = tep_get_page_size(tp_format->tep);
> >               symbol_conf.use_callchain = true;
> >       }
> >
> > diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
> > index c1daf82c9b92..8834e642c4ba 100644
> > --- a/tools/perf/builtin-kwork.c
> > +++ b/tools/perf/builtin-kwork.c
> > @@ -1103,7 +1103,8 @@ static char *evsel__softirq_name(struct evsel *evsel, u64 num)
> >       char *name = NULL;
> >       bool found = false;
> >       struct tep_print_flag_sym *sym = NULL;
> > -     struct tep_print_arg *args = evsel->tp_format->print_fmt.args;
> > +     const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +     struct tep_print_arg *args = tp_format ? evsel__tp_format(evsel)->print_fmt.args : NULL;
>
>                                  why not use tp_format, i.e.:
>
>         struct tep_print_arg *args = tp_format ? tp_format->print_fmt.args : NULL;
>
> >
> >       if ((args == NULL) || (args->next == NULL))
> >               return NULL;
> > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> > index 6b6d4472db6e..0acdb98314f8 100644
> > --- a/tools/perf/builtin-script.c
> > +++ b/tools/perf/builtin-script.c
> > @@ -2289,8 +2289,13 @@ static void process_event(struct perf_script *script,
> >       }
> >  #ifdef HAVE_LIBTRACEEVENT
> >       if (PRINT_FIELD(TRACE) && sample->raw_data) {
> > -             event_format__fprintf(evsel->tp_format, sample->cpu,
> > -                                   sample->raw_data, sample->raw_size, fp);
> > +             const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +             if (tp_format) {
> > +                     event_format__fprintf(tp_format, sample->cpu,
> > +                                           sample->raw_data, sample->raw_size,
> > +                                           fp);
> > +             }
> >       }
> >  #endif
> >       if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
> > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> > index 748b061f8678..86f159f25169 100644
> > --- a/tools/perf/builtin-trace.c
> > +++ b/tools/perf/builtin-trace.c
> > @@ -389,7 +389,12 @@ static struct syscall_arg_fmt *evsel__syscall_arg_fmt(struct evsel *evsel)
> >       }
> >
> >       if (et->fmt == NULL) {
> > -             et->fmt = calloc(evsel->tp_format->format.nr_fields, sizeof(struct syscall_arg_fmt));
> > +             const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +             if (tp_format == NULL)
> > +                     goto out_delete;
> > +
> > +             et->fmt = calloc(tp_format->format.nr_fields, sizeof(struct syscall_arg_fmt));
> >               if (et->fmt == NULL)
> >                       goto out_delete;
> >       }
> > @@ -2154,8 +2159,12 @@ static int evsel__init_tp_arg_scnprintf(struct evsel *evsel, bool *use_btf)
> >       struct syscall_arg_fmt *fmt = evsel__syscall_arg_fmt(evsel);
> >
> >       if (fmt != NULL) {
> > -             syscall_arg_fmt__init_array(fmt, evsel->tp_format->format.fields, use_btf);
> > -             return 0;
> > +             const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +             if (tp_format) {
> > +                     syscall_arg_fmt__init_array(fmt, tp_format->format.fields, use_btf);
> > +                     return 0;
> > +             }
> >       }
> >
> >       return -ENOMEM;
> > @@ -3026,7 +3035,8 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel,
> >  {
> >       char bf[2048];
> >       size_t size = sizeof(bf);
> > -     struct tep_format_field *field = evsel->tp_format->format.fields;
> > +     const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +     struct tep_format_field *field = tp_format ? tp_format->format.fields : NULL;
> >       struct syscall_arg_fmt *arg = __evsel__syscall_arg_fmt(evsel);
> >       size_t printed = 0, btf_printed;
> >       unsigned long val;
> > @@ -3096,6 +3106,7 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel,
> >  {
> >       struct thread *thread;
> >       int callchain_ret = 0;
> > +
>
> ?

Removed, checkpatch.pl again iirc.

> >       /*
> >        * Check if we called perf_evsel__disable(evsel) due to, for instance,
> >        * this event's max_events having been hit and this is an entry coming
> > @@ -3149,11 +3160,13 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel,
> >
> >       if (evsel__is_bpf_output(evsel)) {
> >               bpf_output__fprintf(trace, sample);
> > -     } else if (evsel->tp_format) {
> > -             if (strncmp(evsel->tp_format->name, "sys_enter_", 10) ||
> > -                 trace__fprintf_sys_enter(trace, evsel, sample)) {
> > +     } else {
> > +             const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +             if (tp_format && (strncmp(tp_format->name, "sys_enter_", 10) ||
> > +                               trace__fprintf_sys_enter(trace, evsel, sample))) {
> >                       if (trace->libtraceevent_print) {
> > -                             event_format__fprintf(evsel->tp_format, sample->cpu,
> > +                             event_format__fprintf(tp_format, sample->cpu,
> >                                                     sample->raw_data, sample->raw_size,
> >                                                     trace->output);
> >                       } else {
> > @@ -4081,17 +4094,23 @@ static int ordered_events__deliver_event(struct ordered_events *oe,
> >  static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel *evsel, char *arg,
> >                                                                  char **type)
> >  {
> > -     struct tep_format_field *field;
> > +     const struct tep_format_field *field;
> >       struct syscall_arg_fmt *fmt = __evsel__syscall_arg_fmt(evsel);
> > +     const struct tep_event *tp_format;
> > +
> > +     if (!fmt)
> > +             return NULL;
> >
> > -     if (evsel->tp_format == NULL || fmt == NULL)
> > +     tp_format = evsel__tp_format(evsel);
> > +     if (!tp_format)
> >               return NULL;
> >
> > -     for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
> > +     for (field = tp_format->format.fields; field; field = field->next, ++fmt) {
>
> Since you're touching above and constifying the 'field' variable,
> probably you could make it:
>
>
>         for (const struct tep_format_field *field = tp_format->format.fields; field; field = field->next, ++fmt) {
>
> ?
>
> Just tried this on top of your series, it builds:
>
> diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
> index e663be6f04e70640..5e80f2b4d80e0a86 100644
> --- a/tools/perf/builtin-trace.c
> +++ b/tools/perf/builtin-trace.c
> @@ -4094,7 +4094,6 @@ static int ordered_events__deliver_event(struct ordered_events *oe,
>  static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel *evsel, char *arg,
>                                                                    char **type)
>  {
> -       const struct tep_format_field *field;
>         struct syscall_arg_fmt *fmt = __evsel__syscall_arg_fmt(evsel);
>         const struct tep_event *tp_format;
>
> @@ -4105,7 +4104,7 @@ static struct syscall_arg_fmt *evsel__find_syscall_arg_fmt_by_name(struct evsel
>         if (!tp_format)
>                 return NULL;
>
> -       for (field = tp_format->format.fields; field; field = field->next, ++fmt) {
> +       for (const struct tep_format_field *field= tp_format->format.fields; field; field = field->next, ++fmt) {

This is 114 columns long, so I've applied it but wrapped it.

>                 if (strcmp(field->name, arg) == 0) {
>                         *type = field->type;
>                         return fmt;
>
> ------------------------------------------------------------
>
> >               if (strcmp(field->name, arg) == 0) {
> >                       *type = field->type;
> >                       return fmt;
> >               }
> > +     }
> >
> >       return NULL;
> >  }
> > @@ -4844,13 +4863,18 @@ static void evsel__set_syscall_arg_fmt(struct evsel *evsel, const char *name)
> >               const struct syscall_fmt *scfmt = syscall_fmt__find(name);
> >
> >               if (scfmt) {
> > -                     int skip = 0;
> > +                     const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +                     if (tp_format) {
> > +                             int skip = 0;
> >
> > -                     if (strcmp(evsel->tp_format->format.fields->name, "__syscall_nr") == 0 ||
> > -                         strcmp(evsel->tp_format->format.fields->name, "nr") == 0)
> > -                             ++skip;
> > +                             if (strcmp(tp_format->format.fields->name, "__syscall_nr") == 0 ||
> > +                                 strcmp(tp_format->format.fields->name, "nr") == 0)
> > +                                     ++skip;
> >
> > -                     memcpy(fmt + skip, scfmt->arg, (evsel->tp_format->format.nr_fields - skip) * sizeof(*fmt));
> > +                             memcpy(fmt + skip, scfmt->arg,
> > +                                    (tp_format->format.nr_fields - skip) * sizeof(*fmt));
> > +                     }
> >               }
> >       }
> >  }
> > @@ -4860,10 +4884,16 @@ static int evlist__set_syscall_tp_fields(struct evlist *evlist, bool *use_btf)
> >       struct evsel *evsel;
> >
> >       evlist__for_each_entry(evlist, evsel) {
> > -             if (evsel->priv || !evsel->tp_format)
> > +             const struct tep_event *tp_format;
> > +
> > +             if (evsel->priv)
> > +                     continue;
> > +
> > +             tp_format = evsel__tp_format(evsel);
> > +             if (!tp_format)
> >                       continue;
> >
> > -             if (strcmp(evsel->tp_format->system, "syscalls")) {
> > +             if (strcmp(tp_format->system, "syscalls")) {
> >                       evsel__init_tp_arg_scnprintf(evsel, use_btf);
> >                       continue;
> >               }
> > @@ -4871,20 +4901,24 @@ static int evlist__set_syscall_tp_fields(struct evlist *evlist, bool *use_btf)
> >               if (evsel__init_syscall_tp(evsel))
> >                       return -1;
> >
> > -             if (!strncmp(evsel->tp_format->name, "sys_enter_", 10)) {
> > +             if (!strncmp(tp_format->name, "sys_enter_", 10)) {
> >                       struct syscall_tp *sc = __evsel__syscall_tp(evsel);
> >
> >                       if (__tp_field__init_ptr(&sc->args, sc->id.offset + sizeof(u64)))
> >                               return -1;
> >
> > -                     evsel__set_syscall_arg_fmt(evsel, evsel->tp_format->name + sizeof("sys_enter_") - 1);
> > -             } else if (!strncmp(evsel->tp_format->name, "sys_exit_", 9)) {
> > +                     evsel__set_syscall_arg_fmt(evsel,
> > +                                                tp_format->name + sizeof("sys_enter_") - 1);
> > +             } else if (!strncmp(tp_format->name, "sys_exit_", 9)) {
> >                       struct syscall_tp *sc = __evsel__syscall_tp(evsel);
> >
> > -                     if (__tp_field__init_uint(&sc->ret, sizeof(u64), sc->id.offset + sizeof(u64), evsel->needs_swap))
> > +                     if (__tp_field__init_uint(&sc->ret, sizeof(u64),
> > +                                               sc->id.offset + sizeof(u64),
> > +                                               evsel->needs_swap))
> >                               return -1;
> >
> > -                     evsel__set_syscall_arg_fmt(evsel, evsel->tp_format->name + sizeof("sys_exit_") - 1);
> > +                     evsel__set_syscall_arg_fmt(evsel,
> > +                                                tp_format->name + sizeof("sys_exit_") - 1);
>
> If you left it as
>
> -                       evsel__set_syscall_arg_fmt(evsel, evsel->tp_format->name + sizeof("sys_exit_") - 1);
> +                       evsel__set_syscall_arg_fmt(evsel, tp_format->name + sizeof("sys_exit_") - 1);
>
> It would be shorter than before and slightly faster to visually decode.

101 columns.

> >               }
> >       }
> >
> > diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
> > index 021e9b1d5cc5..d022d3c2955e 100644
> > --- a/tools/perf/util/data-convert-bt.c
> > +++ b/tools/perf/util/data-convert-bt.c
> > @@ -426,8 +426,9 @@ static int add_tracepoint_values(struct ctf_writer *cw,
> >                                struct evsel *evsel,
> >                                struct perf_sample *sample)
> >  {
> > -     struct tep_format_field *common_fields = evsel->tp_format->format.common_fields;
> > -     struct tep_format_field *fields        = evsel->tp_format->format.fields;
> > +     const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +     struct tep_format_field *common_fields = tp_format->format.common_fields;
> > +     struct tep_format_field *fields        = tp_format->format.fields;
> >       int ret;
> >
> >       ret = add_tracepoint_fields_values(cw, event_class, event,
> > @@ -1064,8 +1065,9 @@ static int add_tracepoint_types(struct ctf_writer *cw,
> >                               struct evsel *evsel,
> >                               struct bt_ctf_event_class *class)
> >  {
> > -     struct tep_format_field *common_fields = evsel->tp_format->format.common_fields;
> > -     struct tep_format_field *fields        = evsel->tp_format->format.fields;
> > +     const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +     struct tep_format_field *common_fields = tp_format ? tp_format->format.common_fields : NULL;
> > +     struct tep_format_field *fields        = tp_format ? tp_format->format.fields : NULL;
> >       int ret;
> >
> >       ret = add_tracepoint_fields_types(cw, common_fields, class);
> > diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
> > index 20bfb0884e9e..eb068f38ca81 100644
> > --- a/tools/perf/util/data-convert-json.c
> > +++ b/tools/perf/util/data-convert-json.c
> > @@ -230,12 +230,12 @@ static int process_sample_event(const struct perf_tool *tool,
> >
> >  #ifdef HAVE_LIBTRACEEVENT
> >       if (sample->raw_data) {
> > -             int i;
> > -             struct tep_format_field **fields;
> > +             struct tep_event *tp_format = evsel__tp_format(evsel);
> > +             struct tep_format_field **fields = tp_format ? tep_event_fields(tp_format) : NULL;
> >
> > -             fields = tep_event_fields(evsel->tp_format);
> >               if (fields) {
> > -                     i = 0;
> > +                     int i = 0;
> > +
> >                       while (fields[i]) {
> >                               struct trace_seq s;
> >
> > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> > index f780e30aa259..a95db7e900d5 100644
> > --- a/tools/perf/util/evsel.c
> > +++ b/tools/perf/util/evsel.c
> > @@ -570,6 +570,7 @@ struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx, bool
> >                       evsel->tp_format = trace_event__tp_format(sys, name);
> >                       if (IS_ERR(evsel->tp_format)) {
> >                               err = PTR_ERR(evsel->tp_format);
> > +                             evsel->tp_format = NULL;
> >                               goto out_free;
> >                       }
> >                       attr.config = evsel->tp_format->id;
> > @@ -3209,12 +3210,16 @@ u16 evsel__id_hdr_size(const struct evsel *evsel)
> >  #ifdef HAVE_LIBTRACEEVENT
> >  struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
> >  {
> > -     return tep_find_field(evsel->tp_format, name);
> > +     struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +     return tp_format ? tep_find_field(tp_format, name) : NULL;
> >  }
> >
> >  struct tep_format_field *evsel__common_field(struct evsel *evsel, const char *name)
> >  {
> > -     return tep_find_common_field(evsel->tp_format, name);
> > +     struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +     return tp_format ? tep_find_common_field(tp_format, name) : NULL;
> >  }
> >
> >  void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name)
> > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> > index 04934a7af174..c3e53d320bf5 100644
> > --- a/tools/perf/util/evsel.h
> > +++ b/tools/perf/util/evsel.h
> > @@ -257,6 +257,11 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
> >  {
> >       return evsel__newtp_idx(sys, name, 0, true);
> >  }
> > +
> > +static inline struct tep_event *evsel__tp_format(struct evsel *evsel)
> > +{
> > +     return evsel->tp_format;
> > +}
> >  #endif
> >
> >  #ifdef HAVE_LIBTRACEEVENT
> > diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c
> > index c2c0500d5da9..54c5702f8c00 100644
> > --- a/tools/perf/util/evsel_fprintf.c
> > +++ b/tools/perf/util/evsel_fprintf.c
> > @@ -81,13 +81,15 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
> >  #ifdef HAVE_LIBTRACEEVENT
> >       if (details->trace_fields) {
> >               struct tep_format_field *field;
> > +             const struct tep_event *tp_format;
> >
> >               if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) {
> >                       printed += comma_fprintf(fp, &first, " (not a tracepoint)");
> >                       goto out;
> >               }
> >
> > -             field = evsel->tp_format->format.fields;
> > +             tp_format = evsel__tp_format(evsel);
> > +             field = tp_format ? tp_format->format.fields : NULL;
> >               if (field == NULL) {
> >                       printed += comma_fprintf(fp, &first, " (no trace field)");
> >                       goto out;
> > diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c
> > index e16257d5ab2c..0d63b77b5140 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-perl.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-perl.c
> > @@ -344,7 +344,7 @@ static void perl_process_tracepoint(struct perf_sample *sample,
> >                                   struct addr_location *al)
> >  {
> >       struct thread *thread = al->thread;
> > -     struct tep_event *event = evsel->tp_format;
> > +     struct tep_event *event;
> >       struct tep_format_field *field;
> >       static char handler[256];
> >       unsigned long long val;
> > @@ -362,6 +362,7 @@ static void perl_process_tracepoint(struct perf_sample *sample,
> >       if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT)
> >               return;
> >
> > +     event = evsel__tp_format(evsel);
> >       if (!event) {
> >               pr_debug("ug! no event found for type %" PRIu64, (u64)evsel->core.attr.config);
> >               return;
> > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> > index d7183134b669..77f1ab2d3eac 100644
> > --- a/tools/perf/util/scripting-engines/trace-event-python.c
> > +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> > @@ -946,7 +946,7 @@ static void python_process_tracepoint(struct perf_sample *sample,
> >                                     struct addr_location *al,
> >                                     struct addr_location *addr_al)
> >  {
> > -     struct tep_event *event = evsel->tp_format;
> > +     struct tep_event *event;
> >       PyObject *handler, *context, *t, *obj = NULL, *callchain;
> >       PyObject *dict = NULL, *all_entries_dict = NULL;
> >       static char handler_name[256];
> > @@ -963,6 +963,7 @@ static void python_process_tracepoint(struct perf_sample *sample,
> >
> >       bitmap_zero(events_defined, TRACE_EVENT_TYPE_MAX);
> >
> > +     event = evsel__tp_format(evsel);
> >       if (!event) {
> >               snprintf(handler_name, sizeof(handler_name),
> >                        "ug! no event found for type %" PRIu64, (u64)evsel->core.attr.config);
> > diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> > index 168c488f0178..710839ec3f99 100644
> > --- a/tools/perf/util/sort.c
> > +++ b/tools/perf/util/sort.c
> > @@ -1038,17 +1038,19 @@ static char *get_trace_output(struct hist_entry *he)
> >               .data = he->raw_data,
> >               .size = he->raw_size,
> >       };
> > +     struct tep_event *tp_format;
> >
> >       evsel = hists_to_evsel(he->hists);
> >
> >       trace_seq_init(&seq);
> > -     if (symbol_conf.raw_trace) {
> > -             tep_print_fields(&seq, he->raw_data, he->raw_size,
> > -                              evsel->tp_format);
> > -     } else {
> > -             tep_print_event(evsel->tp_format->tep,
> > -                             &seq, &rec, "%s", TEP_PRINT_INFO);
> > +     tp_format = evsel__tp_format(evsel);
> > +     if (tp_format) {
> > +             if (symbol_conf.raw_trace)
> > +                     tep_print_fields(&seq, he->raw_data, he->raw_size, tp_format);
> > +             else
> > +                     tep_print_event(tp_format->tep, &seq, &rec, "%s", TEP_PRINT_INFO);
> >       }
> > +
> >       /*
> >        * Trim the buffer, it starts at 4KB and we're not going to
> >        * add anything more to this buffer.
> > @@ -3293,9 +3295,8 @@ static int __dynamic_dimension__add(struct evsel *evsel,
> >  static int add_evsel_fields(struct evsel *evsel, bool raw_trace, int level)
> >  {
> >       int ret;
> > -     struct tep_format_field *field;
> > -
> > -     field = evsel->tp_format->format.fields;
> > +     struct tep_event *tp_format = evsel__tp_format(evsel);
> > +     struct tep_format_field *field = tp_format ? tp_format->format.fields : NULL;
> >       while (field) {
> >               ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
> >               if (ret < 0)
> > @@ -3328,13 +3329,19 @@ static int add_all_matching_fields(struct evlist *evlist,
> >  {
> >       int ret = -ESRCH;
> >       struct evsel *evsel;
> > -     struct tep_format_field *field;
> >
> >       evlist__for_each_entry(evlist, evsel) {
> > +             struct tep_event *tp_format;
> > +             struct tep_format_field *field;
> > +
> >               if (evsel->core.attr.type != PERF_TYPE_TRACEPOINT)
> >                       continue;
> >
> > -             field = tep_find_any_field(evsel->tp_format, field_name);
> > +             tp_format = evsel__tp_format(evsel);
> > +             if (tp_format == NULL)
> > +                     continue;
> > +
> > +             field = tep_find_any_field(tp_format, field_name);
> >               if (field == NULL)
> >                       continue;
> >
> > @@ -3416,7 +3423,9 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
> >       if (!strcmp(field_name, "*")) {
> >               ret = add_evsel_fields(evsel, raw_trace, level);
> >       } else {
> > -             struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
> > +             struct tep_event *tp_format = evsel__tp_format(evsel);
> > +             struct tep_format_field *field =
> > +                     tp_format ? tep_find_any_field(tp_format, field_name) : NULL;
> >
> >               if (field == NULL) {
> >                       pr_debug("Cannot find event field for %s.%s\n",
> > diff --git a/tools/perf/util/trace-event-scripting.c b/tools/perf/util/trace-event-scripting.c
> > index bd0000300c77..bab893587863 100644
> > --- a/tools/perf/util/trace-event-scripting.c
> > +++ b/tools/perf/util/trace-event-scripting.c
> > @@ -28,12 +28,14 @@ void scripting_context__update(struct scripting_context *c,
> >                              struct addr_location *al,
> >                              struct addr_location *addr_al)
> >  {
> > -     c->event_data = sample->raw_data;
> > -     c->pevent = NULL;
> >  #ifdef HAVE_LIBTRACEEVENT
> > -     if (evsel->tp_format)
> > -             c->pevent = evsel->tp_format->tep;
> > +     const struct tep_event *tp_format = evsel__tp_format(evsel);
> > +
> > +     c->pevent = tp_format ? tp_format->tep : NULL;
> > +#else
> > +     c->pevent = NULL;
> >  #endif
> > +     c->event_data = sample->raw_data;
> >       c->event = event;
> >       c->sample = sample;
> >       c->evsel = evsel;
> > --
> > 2.47.0.199.ga7371fff76-goog

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ