[PATCH v2 2/9] perf script: Add options for custom vdso path

From: He Kuang
Date: Tue May 10 2016 - 03:42:44 EST


When unwinding callchains on a different machine, vdso info should be
provided so the unwind process won't be interrupted if address falls
into vdso region.

Currently, perf does try to read vdso binary in '.debug' folder, but
the filename of the vdso file is generated randomly based on
VDSO__TEMP_FILE_NAME template, such a filename is not reliable and
users need a way to provide the path of their own vdso binary file.

Signed-off-by: He Kuang <hekuang@xxxxxxxxxx>
---
tools/perf/builtin-script.c | 2 ++
tools/perf/util/dso.c | 7 +++++++
tools/perf/util/dso.h | 1 +
tools/perf/util/symbol.c | 1 +
tools/perf/util/symbol.h | 1 +
5 files changed, 12 insertions(+)

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 8f6ab2a..c88b547 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -2001,6 +2001,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
"file", "vmlinux pathname"),
OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
"file", "kallsyms pathname"),
+ OPT_STRING(0, "vdso", &symbol_conf.vdso_name,
+ "file", "vdso pathname"),
OPT_BOOLEAN('G', "hide-call-graph", &no_callchain,
"When printing symbols do not display call chain"),
OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 8e639543..6ed1cce 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -13,6 +13,7 @@ char dso__symtab_origin(const struct dso *dso)
static const char origin[] = {
[DSO_BINARY_TYPE__KALLSYMS] = 'k',
[DSO_BINARY_TYPE__VMLINUX] = 'v',
+ [DSO_BINARY_TYPE__VDSO] = 'D',
[DSO_BINARY_TYPE__JAVA_JIT] = 'j',
[DSO_BINARY_TYPE__DEBUGLINK] = 'l',
[DSO_BINARY_TYPE__BUILD_ID_CACHE] = 'B',
@@ -113,6 +114,11 @@ int dso__read_binary_type_filename(const struct dso *dso,
build_id_hex, build_id_hex + 2);
break;

+ case DSO_BINARY_TYPE__VDSO:
+ {
+ snprintf(filename, size, "%s", symbol_conf.vdso_name);
+ break;
+ }
case DSO_BINARY_TYPE__VMLINUX:
case DSO_BINARY_TYPE__GUEST_VMLINUX:
case DSO_BINARY_TYPE__SYSTEM_PATH_DSO:
@@ -487,6 +493,7 @@ static void try_to_open_dso(struct dso *dso, struct machine *machine)
enum dso_binary_type binary_type_data[] = {
DSO_BINARY_TYPE__BUILD_ID_CACHE,
DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
+ DSO_BINARY_TYPE__VDSO,
DSO_BINARY_TYPE__NOT_FOUND,
};
int i = 0;
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
index 0953280..05fac98 100644
--- a/tools/perf/util/dso.h
+++ b/tools/perf/util/dso.h
@@ -30,6 +30,7 @@ enum dso_binary_type {
DSO_BINARY_TYPE__KCORE,
DSO_BINARY_TYPE__GUEST_KCORE,
DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
+ DSO_BINARY_TYPE__VDSO,
DSO_BINARY_TYPE__NOT_FOUND,
};

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index e7588dc..4630751 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1363,6 +1363,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod,
case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO:
case DSO_BINARY_TYPE__BUILDID_DEBUGINFO:
case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO:
+ case DSO_BINARY_TYPE__VDSO:
return !kmod && dso->kernel == DSO_TYPE_USER;

case DSO_BINARY_TYPE__KALLSYMS:
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index c8b7544..4e6910e 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -114,6 +114,7 @@ struct symbol_conf {
report_hierarchy;
const char *vmlinux_name,
*kallsyms_name,
+ *vdso_name,
*source_prefix,
*field_sep;
const char *default_guest_vmlinux_name,
--
1.8.5.2