[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZypXmtlqQUxABhMI@x1>
Date: Tue, 5 Nov 2024 14:36:26 -0300
From: Arnaldo Carvalho de Melo <acme@...nel.org>
To: Ian Rogers <irogers@...gle.com>
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 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.
> + 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;
> +
?
> /*
> * 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) {
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.
> }
> }
>
> 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