Currently perf only searches module binaries on the canonical directory (/lib/modules/`uname -r`). But sometimes user needs to load local modules. These cannot be copied to the build-id cache since long name (i.e. real path) of DSOs was not set.
This patch fixes the problem by adding a new --module-dir option so that perf can record modules in the directory. Cc: Adrian Hunter <[email protected]> Cc: Wang Nan <[email protected]> Signed-off-by: Namhyung Kim <[email protected]> --- tools/perf/Documentation/perf-record.txt | 3 +++ tools/perf/builtin-record.c | 2 ++ tools/perf/util/machine.c | 15 ++++++++++++++- tools/perf/util/symbol.h | 3 ++- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt index eb2f5fb90534..9030ace9010f 100644 --- a/tools/perf/Documentation/perf-record.txt +++ b/tools/perf/Documentation/perf-record.txt @@ -480,6 +480,9 @@ Implies --tail-synthesize. --use-kcore:: Use /proc/kcore for symbols and object code reading +--module-dir=PATH:: +Directory name where extra modules are located. + SEE ALSO -------- linkperf:perf-stat[1], linkperf:perf-list[1] diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index a6a6cb56fdf5..8a67fafc0d5b 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -1671,6 +1671,8 @@ static struct option __record_options[] = { "Parse options then exit"), OPT_BOOLEAN(0, "use-kcore", &symbol_conf.use_kcore, "Use /proc/kcore for object code"), + OPT_STRING(0, "module-dir", &symbol_conf.extra_module_path, "path", + "directory name where extra modules are located"), OPT_END() }; diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 799efe920f0c..9a18365c443a 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1108,6 +1108,7 @@ static int machine__set_modules_path(struct machine *machine) { char *version; char modules_path[PATH_MAX]; + int ret; version = get_kernel_version(machine->root_dir); if (!version) @@ -1117,7 +1118,19 @@ static int machine__set_modules_path(struct machine *machine) machine->root_dir, version); free(version); - return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); + ret = map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); + if (ret < 0) + return ret; + + if (symbol_conf.extra_module_path) { + snprintf(modules_path, sizeof(modules_path), "%s/%s", + machine->root_dir, symbol_conf.extra_module_path); + + ret = map_groups__set_modules_path_dir(&machine->kmaps, + modules_path, 0); + } + + return ret; } int __weak arch__fix_module_text_start(u64 *start __maybe_unused, const char *name __maybe_unused) diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 88361eeae813..59370ceb87c4 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h @@ -124,7 +124,8 @@ struct symbol_conf { const char *vmlinux_name, *kallsyms_name, *source_prefix, - *field_sep; + *field_sep, + *extra_module_path; const char *default_guest_vmlinux_name, *default_guest_kallsyms, *default_guest_modules; -- 2.13.1

