From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754614AbdFWFuc (ORCPT ); Fri, 23 Jun 2017 01:50:32 -0400 Received: from LGEAMRELO13.lge.com ([156.147.23.53]:44288 "EHLO lgeamrelo13.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754252AbdFWFsd (ORCPT ); Fri, 23 Jun 2017 01:48:33 -0400 X-Original-SENDERIP: 156.147.1.127 X-Original-MAILFROM: namhyung@kernel.org X-Original-SENDERIP: 10.177.227.17 X-Original-MAILFROM: namhyung@kernel.org From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , kernel-team@lge.com, Masami Hiramatsu , Andi Kleen , Adrian Hunter , Wang Nan Subject: [PATCH/RFC 9/9] perf record: Add --module-dir option Date: Fri, 23 Jun 2017 14:48:27 +0900 Message-Id: <20170623054827.3828-10-namhyung@kernel.org> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20170623054827.3828-1-namhyung@kernel.org> References: <20170623054827.3828-1-namhyung@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Cc: Wang Nan Signed-off-by: Namhyung Kim --- 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