]> git.baikalelectronics.ru Git - kernel.git/commitdiff
perf trace: Factor out the initialization of syscal_arg_fmt->scnprintf
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 3 Oct 2019 18:57:42 +0000 (15:57 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 10:41:27 +0000 (11:41 +0100)
[ Upstream commit 0a6603034a2ab04f6d683e61dbc4dfee3df64728 ]

We set the default scnprint routines for the syscall args based on its
type or on heuristics based on its names, now we'll use this for
tracepoints as well, so move it out of syscall__set_arg_fmts() and into
a routine that receive just an array of syscall_arg_fmt entries + the
tracepoint format fields list.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lkml.kernel.org/n/tip-xs3x0zzyes06c7scdsjn01ty@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Stable-dep-of: 03e9a5d8eb55 ("perf trace: Handle failure when trace point folder is missed")
Signed-off-by: Sasha Levin <sashal@kernel.org>
tools/perf/builtin-trace.c

index 5dc8b123d3f53be350a51f3c8353799e5688a861..175150e90cdcec5b9632590bd264e106008fc78d 100644 (file)
@@ -1455,15 +1455,16 @@ static int syscall__alloc_arg_fmts(struct syscall *sc, int nr_args)
        return 0;
 }
 
-static int syscall__set_arg_fmts(struct syscall *sc)
+static struct tep_format_field *
+syscall_arg_fmt__init_array(struct syscall_arg_fmt *arg, struct tep_format_field *field)
 {
-       struct tep_format_field *field, *last_field = NULL;
-       int idx = 0, len;
+       struct tep_format_field *last_field = NULL;
+       int len;
 
-       for (field = sc->args; field; field = field->next, ++idx) {
+       for (; field; field = field->next, ++arg) {
                last_field = field;
 
-               if (sc->fmt && sc->fmt->arg[idx].scnprintf)
+               if (arg->scnprintf)
                        continue;
 
                len = strlen(field->name);
@@ -1471,13 +1472,13 @@ static int syscall__set_arg_fmts(struct syscall *sc)
                if (strcmp(field->type, "const char *") == 0 &&
                    ((len >= 4 && strcmp(field->name + len - 4, "name") == 0) ||
                     strstr(field->name, "path") != NULL))
-                       sc->arg_fmt[idx].scnprintf = SCA_FILENAME;
+                       arg->scnprintf = SCA_FILENAME;
                else if ((field->flags & TEP_FIELD_IS_POINTER) || strstr(field->name, "addr"))
-                       sc->arg_fmt[idx].scnprintf = SCA_PTR;
+                       arg->scnprintf = SCA_PTR;
                else if (strcmp(field->type, "pid_t") == 0)
-                       sc->arg_fmt[idx].scnprintf = SCA_PID;
+                       arg->scnprintf = SCA_PID;
                else if (strcmp(field->type, "umode_t") == 0)
-                       sc->arg_fmt[idx].scnprintf = SCA_MODE_T;
+                       arg->scnprintf = SCA_MODE_T;
                else if ((strcmp(field->type, "int") == 0 ||
                          strcmp(field->type, "unsigned int") == 0 ||
                          strcmp(field->type, "long") == 0) &&
@@ -1489,10 +1490,17 @@ static int syscall__set_arg_fmts(struct syscall *sc)
                         * 23 unsigned int
                         * 7 unsigned long
                         */
-                       sc->arg_fmt[idx].scnprintf = SCA_FD;
+                       arg->scnprintf = SCA_FD;
                }
        }
 
+       return last_field;
+}
+
+static int syscall__set_arg_fmts(struct syscall *sc)
+{
+       struct tep_format_field *last_field = syscall_arg_fmt__init_array(sc->arg_fmt, sc->args);
+
        if (last_field)
                sc->args_size = last_field->offset + last_field->size;