perf tools: Refactor out kernel symbol argument sanity checking

User supplied values for vmlinux and kallsyms are checked before
continuing. Refactor this into a function so that it can be used
elsewhere.

Reviewed-by: Denis Nikitin <denik@chromium.org>
Signed-off-by: James Clark <james.clark@arm.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20211018134844.2627174-2-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
James Clark 2021-10-18 14:48:41 +01:00 committed by Arnaldo Carvalho de Melo
parent 1a86f4ba5c
commit a3df50abeb
3 changed files with 26 additions and 11 deletions

View File

@ -1378,18 +1378,9 @@ int cmd_report(int argc, const char **argv)
if (quiet) if (quiet)
perf_quiet_option(); perf_quiet_option();
if (symbol_conf.vmlinux_name && ret = symbol__validate_sym_arguments();
access(symbol_conf.vmlinux_name, R_OK)) { if (ret)
pr_err("Invalid file: %s\n", symbol_conf.vmlinux_name);
ret = -EINVAL;
goto exit; goto exit;
}
if (symbol_conf.kallsyms_name &&
access(symbol_conf.kallsyms_name, R_OK)) {
pr_err("Invalid file: %s\n", symbol_conf.kallsyms_name);
ret = -EINVAL;
goto exit;
}
if (report.inverted_callchain) if (report.inverted_callchain)
callchain_param.order = ORDER_CALLER; callchain_param.order = ORDER_CALLER;

View File

@ -2634,3 +2634,25 @@ struct mem_info *mem_info__new(void)
refcount_set(&mi->refcnt, 1); refcount_set(&mi->refcnt, 1);
return mi; return mi;
} }
/*
* Checks that user supplied symbol kernel files are accessible because
* the default mechanism for accessing elf files fails silently. i.e. if
* debug syms for a build ID aren't found perf carries on normally. When
* they are user supplied we should assume that the user doesn't want to
* silently fail.
*/
int symbol__validate_sym_arguments(void)
{
if (symbol_conf.vmlinux_name &&
access(symbol_conf.vmlinux_name, R_OK)) {
pr_err("Invalid file: %s\n", symbol_conf.vmlinux_name);
return -EINVAL;
}
if (symbol_conf.kallsyms_name &&
access(symbol_conf.kallsyms_name, R_OK)) {
pr_err("Invalid file: %s\n", symbol_conf.kallsyms_name);
return -EINVAL;
}
return 0;
}

View File

@ -286,4 +286,6 @@ static inline void __mem_info__zput(struct mem_info **mi)
#define mem_info__zput(mi) __mem_info__zput(&mi) #define mem_info__zput(mi) __mem_info__zput(&mi)
int symbol__validate_sym_arguments(void);
#endif /* __PERF_SYMBOL */ #endif /* __PERF_SYMBOL */