Commit c46d634a authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo
Browse files

perf evsel: Add/use accessor for tp_format



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.

Reviewed-by: default avatarNamhyung Kim <namhyung@kernel.org>
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ben Gainey <ben.gainey@arm.com>
Cc: Colin Ian King <colin.i.king@gmail.com>
Cc: Dominique Martinet <asmadeus@codewreck.org>
Cc: Ilkka Koskinen <ilkka@os.amperecomputing.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Paran Lee <p4ranlee@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steinar H. Gunderson <sesse@google.com>
Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Cc: Weilin Wang <weilin.wang@intel.com>
Cc: Yang Jihong <yangjihong@bytedance.com>
Cc: Yang Li <yang.lee@linux.alibaba.com>
Cc: Ze Gao <zegao2021@gmail.com>
Cc: Zixian Cai <fzczx123@gmail.com>
Cc: zhaimingbing <zhaimingbing@cmss.chinamobile.com>
Link: https://lore.kernel.org/r/20241118225345.889810-6-irogers@google.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 800c93ff
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -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) {
@@ -2012,13 +2014,13 @@ 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");
		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;
	}

+2 −1
Original line number Diff line number Diff line
@@ -1104,7 +1104,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 ? tp_format->print_fmt.args : NULL;

	if ((args == NULL) || (args->next == NULL))
		return NULL;
+7 −2
Original line number Diff line number Diff line
@@ -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))
+56 −23
Original line number Diff line number Diff line
@@ -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,9 +2159,13 @@ 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);
		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;
}
@@ -3027,7 +3036,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;
@@ -3145,11 +3155,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 {
@@ -4077,17 +4089,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;
	struct syscall_arg_fmt *fmt = __evsel__syscall_arg_fmt(evsel);
	const struct tep_event *tp_format;

	if (evsel->tp_format == NULL || fmt == NULL)
	if (!fmt)
		return NULL;

	for (field = evsel->tp_format->format.fields; field; field = field->next, ++fmt)
	tp_format = evsel__tp_format(evsel);
	if (!tp_format)
		return NULL;

	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;
		}
	}

	return NULL;
}
@@ -4843,13 +4861,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) {
			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)
				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));
			}
		}
	}
}
@@ -4859,10 +4882,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;
		}
@@ -4870,20 +4899,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);
		}
	}

+6 −4
Original line number Diff line number Diff line
@@ -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);
Loading