From: Arnaldo Carvalho de Melo Date: Mon, 24 Jun 2024 18:13:44 +0000 (+0800) Subject: perf trace: Introduce trace__btf_scnprintf() X-Git-Tag: v6.12-rc1~109^2~307 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62284329b194606f73252935cc422cf6156e811a;p=thirdparty%2Fkernel%2Fstable.git perf trace: Introduce trace__btf_scnprintf() To have a central place that will look at the BTF type and call the right scnprintf routine or return zero, meaning BTF pretty printing isn't available or not implemented for a specific type. Signed-off-by: Howard Chu Tested-by: Howard Chu Cc: Adrian Hunter Cc: Ian Rogers Cc: Jiri Olsa Cc: Kan Liang Cc: Namhyung Kim Link: https://lore.kernel.org/r/20240624181345.124764-8-howardchu95@gmail.com Signed-off-by: Arnaldo Carvalho de Melo --- diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index e664001d5ed75..d9104fc4f61fc 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -981,18 +981,28 @@ static size_t btf_enum_scnprintf(const struct btf_type *type, struct btf *btf, c static size_t trace__btf_enum_scnprintf(struct trace *trace, struct syscall_arg_fmt *arg_fmt, char *bf, size_t size, int val, char *type) { - if (trace->btf == NULL) - return 0; - if (syscall_arg_fmt__cache_btf_enum(arg_fmt, trace->btf, type) < 0) return 0; return btf_enum_scnprintf(arg_fmt->type, trace->btf, bf, size, val); } + +static size_t trace__btf_scnprintf(struct trace *trace, struct syscall_arg_fmt *arg_fmt, char *bf, + size_t size, int val, char *type) +{ + if (trace->btf == NULL) + return 0; + + if (arg_fmt->is_enum) + return trace__btf_enum_scnprintf(trace, arg_fmt, bf, size, val, type); + + return 0; +} + #else // HAVE_LIBBPF_SUPPORT -static size_t trace__btf_enum_scnprintf(struct trace *trace __maybe_unused, struct syscall_arg_fmt *arg_fmt __maybe_unused, - char *bf __maybe_unused, size_t size __maybe_unused, int val __maybe_unused, - char *type __maybe_unused) +static size_t trace__btf_scnprintf(struct trace *trace __maybe_unused, struct syscall_arg_fmt *arg_fmt __maybe_unused, + char *bf __maybe_unused, size_t size __maybe_unused, int val __maybe_unused, + char *type __maybe_unused) { return 0; } @@ -2183,7 +2193,7 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, unsigned char *args, void *augmented_args, int augmented_args_size, struct trace *trace, struct thread *thread) { - size_t printed = 0; + size_t printed = 0, btf_printed; unsigned long val; u8 bit = 1; struct syscall_arg arg = { @@ -2237,13 +2247,11 @@ static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size, if (trace->show_arg_names) printed += scnprintf(bf + printed, size - printed, "%s: ", field->name); - if (sc->arg_fmt[arg.idx].is_enum) { - size_t p = trace__btf_enum_scnprintf(trace, &sc->arg_fmt[arg.idx], bf + printed, - size - printed, val, field->type); - if (p) { - printed += p; - continue; - } + btf_printed = trace__btf_scnprintf(trace, &sc->arg_fmt[arg.idx], bf + printed, + size - printed, val, field->type); + if (btf_printed) { + printed += btf_printed; + continue; } printed += syscall_arg_fmt__scnprintf_val(&sc->arg_fmt[arg.idx], @@ -2892,7 +2900,7 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel, size_t size = sizeof(bf); struct tep_format_field *field = evsel->tp_format->format.fields; struct syscall_arg_fmt *arg = __evsel__syscall_arg_fmt(evsel); - size_t printed = 0; + size_t printed = 0, btf_printed; unsigned long val; u8 bit = 1; struct syscall_arg syscall_arg = { @@ -2942,13 +2950,10 @@ static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel, if (trace->show_arg_names) printed += scnprintf(bf + printed, size - printed, "%s: ", field->name); - if (arg->is_enum) { - size_t p = trace__btf_enum_scnprintf(trace, arg, bf + printed, - size - printed, val, field->type); - if (p) { - printed += p; - continue; - } + btf_printed = trace__btf_scnprintf(trace, arg, bf + printed, size - printed, val, field->type); + if (btf_printed) { + printed += btf_printed; + continue; } printed += syscall_arg_fmt__scnprintf_val(arg, bf + printed, size - printed, &syscall_arg, val);