perf trace: Factor out the initialization of syscal_arg_fmt->scnprintf
[ Upstream commit 8d1d4ff5e239d9ef385444bc0d855127d7b32754 ] 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>
This commit is contained in:
parent
ba67de37ad
commit
a2fcb44f5e
@ -1455,15 +1455,16 @@ static int syscall__alloc_arg_fmts(struct syscall *sc, int nr_args)
|
|||||||
return 0;
|
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;
|
struct tep_format_field *last_field = NULL;
|
||||||
int idx = 0, len;
|
int len;
|
||||||
|
|
||||||
for (field = sc->args; field; field = field->next, ++idx) {
|
for (; field; field = field->next, ++arg) {
|
||||||
last_field = field;
|
last_field = field;
|
||||||
|
|
||||||
if (sc->fmt && sc->fmt->arg[idx].scnprintf)
|
if (arg->scnprintf)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
len = strlen(field->name);
|
len = strlen(field->name);
|
||||||
@ -1471,13 +1472,13 @@ static int syscall__set_arg_fmts(struct syscall *sc)
|
|||||||
if (strcmp(field->type, "const char *") == 0 &&
|
if (strcmp(field->type, "const char *") == 0 &&
|
||||||
((len >= 4 && strcmp(field->name + len - 4, "name") == 0) ||
|
((len >= 4 && strcmp(field->name + len - 4, "name") == 0) ||
|
||||||
strstr(field->name, "path") != NULL))
|
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"))
|
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)
|
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)
|
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 ||
|
else if ((strcmp(field->type, "int") == 0 ||
|
||||||
strcmp(field->type, "unsigned int") == 0 ||
|
strcmp(field->type, "unsigned int") == 0 ||
|
||||||
strcmp(field->type, "long") == 0) &&
|
strcmp(field->type, "long") == 0) &&
|
||||||
@ -1489,10 +1490,17 @@ static int syscall__set_arg_fmts(struct syscall *sc)
|
|||||||
* 23 unsigned int
|
* 23 unsigned int
|
||||||
* 7 unsigned long
|
* 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)
|
if (last_field)
|
||||||
sc->args_size = last_field->offset + last_field->size;
|
sc->args_size = last_field->offset + last_field->size;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user