perf trace: Introduce trace__btf_scnprintf()
authorArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 24 Jun 2024 18:13:44 +0000 (02:13 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 31 Jul 2024 19:12:59 +0000 (16:12 -0300)
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 <howardchu95@gmail.com>
Tested-by: Howard Chu <howardchu95@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240624181345.124764-8-howardchu95@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-trace.c

index e664001..d9104fc 100644 (file)
@@ -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);