[PATCH/RFC 8/9] perf record: Not use kcore by default

From: Namhyung Kim
Date: Fri Jun 23 2017 - 01:49:13 EST


Change perf record not to use /proc/kcore by default. This is for
kernel developers who use qemu or kvmtools to test their kernels. On
those environment, kernel image was loaded directly by qemu and the
vmlinux might not be available on the guest.

At the last stage of perf record, it finds hit DSOs to mark them to
record the build-ids. During this process, it tries to load kernel maps
and falls back to use kallsyms with kcore. But dso__load_kcore()
removes old mappings so all module info would disappear.

I'm not sure this is intended but it'd be good if it could keep the info
and use it for build-id cache. Add --use-kcore option to request it
explicitly (like in perf-with-kcore).

Cc: Adrian Hunter <adrian.hunter@xxxxxxxxx>
Cc: Wang Nan <wangnan0@xxxxxxxxxx>
Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
---
tools/perf/Documentation/perf-record.txt | 3 +++
tools/perf/builtin-record.c | 5 +++++
tools/perf/perf-with-kcore.sh | 1 +
3 files changed, 9 insertions(+)

diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index b0e9e921d534..eb2f5fb90534 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -477,6 +477,9 @@ config terms. For example: 'cycles/overwrite/' and 'instructions/no-overwrite/'.

Implies --tail-synthesize.

+--use-kcore::
+Use /proc/kcore for symbols and object code reading
+
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 ee7d0a82ccd0..a6a6cb56fdf5 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1669,6 +1669,8 @@ static struct option __record_options[] = {
"signal"),
OPT_BOOLEAN(0, "dry-run", &dry_run,
"Parse options then exit"),
+ OPT_BOOLEAN(0, "use-kcore", &symbol_conf.use_kcore,
+ "Use /proc/kcore for object code"),
OPT_END()
};

@@ -1705,6 +1707,9 @@ int cmd_record(int argc, const char **argv)
if (rec->evlist == NULL)
return -ENOMEM;

+ /* default to not use kcore, user can change it by --use-kcore option */
+ symbol_conf.use_kcore = false;
+
err = perf_config(perf_record_config, rec);
if (err)
return err;
diff --git a/tools/perf/perf-with-kcore.sh b/tools/perf/perf-with-kcore.sh
index 7e47a7cbc195..4efde3e577dd 100644
--- a/tools/perf/perf-with-kcore.sh
+++ b/tools/perf/perf-with-kcore.sh
@@ -233,6 +233,7 @@ fi

case "$PERF_SUB_COMMAND" in
"record")
+ PERF_OPTIONS+=("--use-kcore")
while [ "$1" != "--" ] ; do
PERF_OPTIONS+=("$1")
shift || break
--
2.13.1