* [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4)
@ 2017-06-08 7:31 Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 1/9] perf annotate: Fix symbolic link of build-id cache Namhyung Kim
` (9 more replies)
0 siblings, 10 replies; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
Hello,
This is v4 of my compressed kernel module work. Please take a look.
* changes in v4)
- fix build-id cache symbolic link handling in annotate
- separate fix for a memory leak (Arnaldo)
- consolidate error path in __open_dso (Arnaldo)
- remove decompressed file after use
The code is avaiable at 'perf/kmod-decomp-v4' branch in my tree:
git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git
Thanks,
Namhyung
Namhyung Kim (9):
perf annotate: Fix symbolic link of build-id cache
perf tools: Fix a memory leak in __open_dso()
perf tools: Introduce dso__decompress_kmodule_{fd,path}
perf annotate: Use dso__decompress_kmodule_path()
perf tools: Decompress kernel module when reading DSO data
perf tools: Consolidate error path in __open_dso()
perf test: Decompress kernel module before objdump
perf symbols: Keep DSO->symtab_type after decompress
perf symbols: Kill dso__build_id_is_kmod()
tools/perf/tests/code-reading.c | 20 +++++++++-
tools/perf/util/annotate.c | 37 ++++++------------
tools/perf/util/build-id.c | 45 ----------------------
tools/perf/util/build-id.h | 1 -
tools/perf/util/dso.c | 85 ++++++++++++++++++++++++++++++++++++++---
tools/perf/util/dso.h | 6 +++
tools/perf/util/symbol-elf.c | 38 ++----------------
tools/perf/util/symbol.c | 4 --
8 files changed, 119 insertions(+), 117 deletions(-)
--
2.13.1
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v4 1/9] perf annotate: Fix symbolic link of build-id cache
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:49 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 2/9] perf tools: Fix a memory leak in __open_dso() Namhyung Kim
` (8 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan, Taeung Song
The commit 6ebd2547dd24 ("perf annotate: Fix a bug following symbolic
link of a build-id file") changed to use dirname to follow the symlink.
But it only considers new-style build-id cache names so old names fail
on readlink() and force to use system path which might not available.
Cc: Taeung Song <treeze.taeung@gmail.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/annotate.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 1367d7e35242..df4486c3a2fa 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1321,6 +1321,7 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
char linkname[PATH_MAX];
char *build_id_filename;
char *build_id_path = NULL;
+ char *pos;
if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
!dso__is_kcore(dso))
@@ -1340,7 +1341,14 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
if (!build_id_path)
return -1;
- dirname(build_id_path);
+ /*
+ * old style build-id cache has name of XX/XXXXXXX.. while
+ * new style has XX/XXXXXXX../{elf,kallsyms,vdso}.
+ * extract the build-id part of dirname in the new style only.
+ */
+ pos = strrchr(build_id_path, '/');
+ if (pos && strlen(pos) < SBUILD_ID_SIZE - 2)
+ dirname(build_id_path);
if (dso__is_kcore(dso) ||
readlink(build_id_path, linkname, sizeof(linkname)) < 0 ||
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 2/9] perf tools: Fix a memory leak in __open_dso()
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 1/9] perf annotate: Fix symbolic link of build-id cache Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:50 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 3/9] perf tools: Introduce dso__decompress_kmodule_{fd,path} Namhyung Kim
` (7 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
The name should be freed on error path.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/dso.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index b27d127cdf68..1f29e4fe7af0 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -412,8 +412,10 @@ static int __open_dso(struct dso *dso, struct machine *machine)
return -EINVAL;
}
- if (!is_regular_file(name))
+ if (!is_regular_file(name)) {
+ free(name);
return -EINVAL;
+ }
fd = do_open(name);
free(name);
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 3/9] perf tools: Introduce dso__decompress_kmodule_{fd,path}
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 1/9] perf annotate: Fix symbolic link of build-id cache Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 2/9] perf tools: Fix a memory leak in __open_dso() Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:50 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 4/9] perf annotate: Use dso__decompress_kmodule_path() Namhyung Kim
` (6 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
Move decompress_kmodule() to util/dso.c and split it to two functions
returning fd and (decompressed) file path. Existing user only wants the
fd version but the path version will be used soon.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/dso.c | 58 ++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/dso.h | 6 +++++
tools/perf/util/symbol-elf.c | 36 +--------------------------
3 files changed, 65 insertions(+), 35 deletions(-)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 1f29e4fe7af0..b346b8eba65c 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -248,6 +248,64 @@ bool dso__needs_decompress(struct dso *dso)
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
}
+static int decompress_kmodule(struct dso *dso, const char *name, char *tmpbuf)
+{
+ int fd = -1;
+ struct kmod_path m;
+
+ if (!dso__needs_decompress(dso))
+ return -1;
+
+ if (kmod_path__parse_ext(&m, dso->long_name))
+ return -1;
+
+ if (!m.comp)
+ goto out;
+
+ fd = mkstemp(tmpbuf);
+ if (fd < 0) {
+ dso->load_errno = errno;
+ goto out;
+ }
+
+ if (!decompress_to_file(m.ext, name, fd)) {
+ dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE;
+ close(fd);
+ fd = -1;
+ }
+
+out:
+ free(m.ext);
+ return fd;
+}
+
+int dso__decompress_kmodule_fd(struct dso *dso, const char *name)
+{
+ char tmpbuf[] = KMOD_DECOMP_NAME;
+ int fd;
+
+ fd = decompress_kmodule(dso, name, tmpbuf);
+ unlink(tmpbuf);
+ return fd;
+}
+
+int dso__decompress_kmodule_path(struct dso *dso, const char *name,
+ char *pathname, size_t len)
+{
+ char tmpbuf[] = KMOD_DECOMP_NAME;
+ int fd;
+
+ fd = decompress_kmodule(dso, name, tmpbuf);
+ if (fd < 0) {
+ unlink(tmpbuf);
+ return -1;
+ }
+
+ strncpy(pathname, tmpbuf, len);
+ close(fd);
+ return 0;
+}
+
/*
* Parses kernel module specified in @path and updates
* @m argument like:
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
index 5fe2ab5877bd..bd061ba7b47c 100644
--- a/tools/perf/util/dso.h
+++ b/tools/perf/util/dso.h
@@ -244,6 +244,12 @@ bool is_supported_compression(const char *ext);
bool is_kernel_module(const char *pathname, int cpumode);
bool decompress_to_file(const char *ext, const char *filename, int output_fd);
bool dso__needs_decompress(struct dso *dso);
+int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
+int dso__decompress_kmodule_path(struct dso *dso, const char *name,
+ char *pathname, size_t len);
+
+#define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX"
+#define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME)
struct kmod_path {
char *name;
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 1fb2efae4f02..d342e771dbad 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -637,40 +637,6 @@ static int dso__swap_init(struct dso *dso, unsigned char eidata)
return 0;
}
-static int decompress_kmodule(struct dso *dso, const char *name,
- enum dso_binary_type type)
-{
- int fd = -1;
- char tmpbuf[] = "/tmp/perf-kmod-XXXXXX";
- struct kmod_path m;
-
- if (type != DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP &&
- type != DSO_BINARY_TYPE__GUEST_KMODULE_COMP &&
- type != DSO_BINARY_TYPE__BUILD_ID_CACHE)
- return -1;
-
- if (kmod_path__parse_ext(&m, dso->long_name) || !m.comp)
- return -1;
-
- fd = mkstemp(tmpbuf);
- if (fd < 0) {
- dso->load_errno = errno;
- goto out;
- }
-
- if (!decompress_to_file(m.ext, name, fd)) {
- dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE;
- close(fd);
- fd = -1;
- }
-
- unlink(tmpbuf);
-
-out:
- free(m.ext);
- return fd;
-}
-
bool symsrc__possibly_runtime(struct symsrc *ss)
{
return ss->dynsym || ss->opdsec;
@@ -702,7 +668,7 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
int fd;
if (dso__needs_decompress(dso)) {
- fd = decompress_kmodule(dso, name, type);
+ fd = dso__decompress_kmodule_fd(dso, name);
if (fd < 0)
return -1;
} else {
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 4/9] perf annotate: Use dso__decompress_kmodule_path()
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
` (2 preceding siblings ...)
2017-06-08 7:31 ` [PATCH v4 3/9] perf tools: Introduce dso__decompress_kmodule_{fd,path} Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:51 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 5/9] perf tools: Decompress kernel module when reading DSO data Namhyung Kim
` (5 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
Convert open-coded decompress routine to use the function.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/annotate.c | 27 +++------------------------
1 file changed, 3 insertions(+), 24 deletions(-)
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index df4486c3a2fa..ddbd56df9187 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1431,31 +1431,10 @@ int symbol__disassemble(struct symbol *sym, struct map *map, const char *arch_na
sizeof(symfs_filename));
}
} else if (dso__needs_decompress(dso)) {
- char tmp[PATH_MAX];
- struct kmod_path m;
- int fd;
- bool ret;
+ char tmp[KMOD_DECOMP_LEN];
- if (kmod_path__parse_ext(&m, symfs_filename))
- goto out;
-
- snprintf(tmp, PATH_MAX, "/tmp/perf-kmod-XXXXXX");
-
- fd = mkstemp(tmp);
- if (fd < 0) {
- free(m.ext);
- goto out;
- }
-
- ret = decompress_to_file(m.ext, symfs_filename, fd);
-
- if (ret)
- pr_err("Cannot decompress %s %s\n", m.ext, symfs_filename);
-
- free(m.ext);
- close(fd);
-
- if (!ret)
+ if (dso__decompress_kmodule_path(dso, symfs_filename,
+ tmp, sizeof(tmp)) < 0)
goto out;
strcpy(symfs_filename, tmp);
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 5/9] perf tools: Decompress kernel module when reading DSO data
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
` (3 preceding siblings ...)
2017-06-08 7:31 ` [PATCH v4 4/9] perf annotate: Use dso__decompress_kmodule_path() Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:51 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 6/9] perf tools: Consolidate error path in __open_dso() Namhyung Kim
` (4 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
Currently perf decompresses kernel modules when loading symbol table but
it missed to do it when reading raw data.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/dso.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index b346b8eba65c..c63525d845c5 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -475,7 +475,23 @@ static int __open_dso(struct dso *dso, struct machine *machine)
return -EINVAL;
}
+ if (dso__needs_decompress(dso)) {
+ char newpath[KMOD_DECOMP_LEN];
+ size_t len = sizeof(newpath);
+
+ if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) {
+ free(name);
+ return -dso->load_errno;
+ }
+
+ strcpy(name, newpath);
+ }
+
fd = do_open(name);
+
+ if (dso__needs_decompress(dso))
+ unlink(name);
+
free(name);
return fd;
}
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 6/9] perf tools: Consolidate error path in __open_dso()
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
` (4 preceding siblings ...)
2017-06-08 7:31 ` [PATCH v4 5/9] perf tools: Decompress kernel module when reading DSO data Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:52 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 7/9] perf test: Decompress kernel module before objdump Namhyung Kim
` (3 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
On failure, it should free the 'name', so clean up the error path using
goto.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/dso.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index c63525d845c5..4e7ab611377a 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -454,7 +454,7 @@ static int do_open(char *name)
static int __open_dso(struct dso *dso, struct machine *machine)
{
- int fd;
+ int fd = -EINVAL;
char *root_dir = (char *)"";
char *name = malloc(PATH_MAX);
@@ -465,23 +465,19 @@ static int __open_dso(struct dso *dso, struct machine *machine)
root_dir = machine->root_dir;
if (dso__read_binary_type_filename(dso, dso->binary_type,
- root_dir, name, PATH_MAX)) {
- free(name);
- return -EINVAL;
- }
+ root_dir, name, PATH_MAX))
+ goto out;
- if (!is_regular_file(name)) {
- free(name);
- return -EINVAL;
- }
+ if (!is_regular_file(name))
+ goto out;
if (dso__needs_decompress(dso)) {
char newpath[KMOD_DECOMP_LEN];
size_t len = sizeof(newpath);
if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) {
- free(name);
- return -dso->load_errno;
+ fd = -dso->load_errno;
+ goto out;
}
strcpy(name, newpath);
@@ -492,6 +488,7 @@ static int __open_dso(struct dso *dso, struct machine *machine)
if (dso__needs_decompress(dso))
unlink(name);
+out:
free(name);
return fd;
}
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 7/9] perf test: Decompress kernel module before objdump
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
` (5 preceding siblings ...)
2017-06-08 7:31 ` [PATCH v4 6/9] perf tools: Consolidate error path in __open_dso() Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 7:34 ` Adrian Hunter
2017-06-08 22:52 ` [tip:perf/urgent] perf tests: " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 8/9] perf symbols: Keep DSO->symtab_type after decompress Namhyung Kim
` (2 subsequent siblings)
9 siblings, 2 replies; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
If a kernel modules is compressed, it should be decompressed before
running objdump to parse binary data correctly. This fixes a failure of
object code reading test for me.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/tests/code-reading.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 1f14e7612cbb..94b7c7b02bde 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -229,6 +229,8 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
unsigned char buf2[BUFSZ];
size_t ret_len;
u64 objdump_addr;
+ const char *objdump_name;
+ char decomp_name[KMOD_DECOMP_LEN];
int ret;
pr_debug("Reading object code for memory address: %#"PRIx64"\n", addr);
@@ -289,9 +291,25 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
state->done[state->done_cnt++] = al.map->start;
}
+ objdump_name = al.map->dso->long_name;
+ if (dso__needs_decompress(al.map->dso)) {
+ if (dso__decompress_kmodule_path(al.map->dso, objdump_name,
+ decomp_name,
+ sizeof(decomp_name)) < 0) {
+ pr_debug("decompression failed\n");
+ return -1;
+ }
+
+ objdump_name = decomp_name;
+ }
+
/* Read the object code using objdump */
objdump_addr = map__rip_2objdump(al.map, al.addr);
- ret = read_via_objdump(al.map->dso->long_name, objdump_addr, buf2, len);
+ ret = read_via_objdump(objdump_name, objdump_addr, buf2, len);
+
+ if (dso__needs_decompress(al.map->dso))
+ unlink(objdump_name);
+
if (ret > 0) {
/*
* The kernel maps are inaccurate - assume objdump is right in
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 8/9] perf symbols: Keep DSO->symtab_type after decompress
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
` (6 preceding siblings ...)
2017-06-08 7:31 ` [PATCH v4 7/9] perf test: Decompress kernel module before objdump Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:53 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 9/9] perf symbols: Kill dso__build_id_is_kmod() Namhyung Kim
2017-06-08 12:10 ` [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Jiri Olsa
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
The symsrc__init() overwrites dso->symtab_type as symsrc->type in
dso__load_sym(). But for compressed kernel modules in the build-id
cache, it should have original symtab type to be decompressed as needed.
This fixes perf annotate to show disassembly of the function properly.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/symbol-elf.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index d342e771dbad..502505cf236a 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -671,6 +671,8 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
fd = dso__decompress_kmodule_fd(dso, name);
if (fd < 0)
return -1;
+
+ type = dso->symtab_type;
} else {
fd = open(name, O_RDONLY);
if (fd < 0) {
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 9/9] perf symbols: Kill dso__build_id_is_kmod()
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
` (7 preceding siblings ...)
2017-06-08 7:31 ` [PATCH v4 8/9] perf symbols: Keep DSO->symtab_type after decompress Namhyung Kim
@ 2017-06-08 7:31 ` Namhyung Kim
2017-06-08 22:53 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 12:10 ` [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Jiri Olsa
9 siblings, 1 reply; 21+ messages in thread
From: Namhyung Kim @ 2017-06-08 7:31 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Adrian Hunter, Wang Nan
The commit e7ee40475760 ("perf symbols: Fix symbols searching for module
in buildid-cache") added the function to check kernel modules reside in
the build-id cache. This was because there's no way to identify a DSO
which is actually a kernel module. So it searched linkname of the file
and find ".ko" suffix.
But this does not work for compressed kernel modules and now such DSOs
have correct symtab_type now. So no need to check it anymore. This
patch essentially reverts the commit.
Cc: Wang Nan <wangnan0@huawei.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/build-id.c | 45 ---------------------------------------------
tools/perf/util/build-id.h | 1 -
tools/perf/util/symbol.c | 4 ----
3 files changed, 50 deletions(-)
diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
index 168cc49654e7..e0148b081bdf 100644
--- a/tools/perf/util/build-id.c
+++ b/tools/perf/util/build-id.c
@@ -278,51 +278,6 @@ char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size)
return bf;
}
-bool dso__build_id_is_kmod(const struct dso *dso, char *bf, size_t size)
-{
- char *id_name = NULL, *ch;
- struct stat sb;
- char sbuild_id[SBUILD_ID_SIZE];
-
- if (!dso->has_build_id)
- goto err;
-
- build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
- id_name = build_id_cache__linkname(sbuild_id, NULL, 0);
- if (!id_name)
- goto err;
- if (access(id_name, F_OK))
- goto err;
- if (lstat(id_name, &sb) == -1)
- goto err;
- if ((size_t)sb.st_size > size - 1)
- goto err;
- if (readlink(id_name, bf, size - 1) < 0)
- goto err;
-
- bf[sb.st_size] = '\0';
-
- /*
- * link should be:
- * ../../lib/modules/4.4.0-rc4/kernel/net/ipv4/netfilter/nf_nat_ipv4.ko/a09fe3eb3147dafa4e3b31dbd6257e4d696bdc92
- */
- ch = strrchr(bf, '/');
- if (!ch)
- goto err;
- if (ch - 3 < bf)
- goto err;
-
- free(id_name);
- return strncmp(".ko", ch - 3, 3) == 0;
-err:
- pr_err("Invalid build id: %s\n", id_name ? :
- dso->long_name ? :
- dso->short_name ? :
- "[unknown]");
- free(id_name);
- return false;
-}
-
#define dsos__for_each_with_build_id(pos, head) \
list_for_each_entry(pos, head, node) \
if (!pos->has_build_id) \
diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h
index 8a89b195c1fc..96690a55c62c 100644
--- a/tools/perf/util/build-id.h
+++ b/tools/perf/util/build-id.h
@@ -17,7 +17,6 @@ char *build_id_cache__kallsyms_path(const char *sbuild_id, char *bf,
size_t size);
char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size);
-bool dso__build_id_is_kmod(const struct dso *dso, char *bf, size_t size);
int build_id__mark_dso_hit(struct perf_tool *tool, union perf_event *event,
struct perf_sample *sample, struct perf_evsel *evsel,
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 8f2b068ff756..e7a98dbd2aed 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1562,10 +1562,6 @@ int dso__load(struct dso *dso, struct map *map)
if (!runtime_ss && syms_ss)
runtime_ss = syms_ss;
- if (syms_ss && syms_ss->type == DSO_BINARY_TYPE__BUILD_ID_CACHE)
- if (dso__build_id_is_kmod(dso, name, PATH_MAX))
- kmod = true;
-
if (syms_ss)
ret = dso__load_sym(dso, map, syms_ss, runtime_ss, kmod);
else
--
2.13.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v4 7/9] perf test: Decompress kernel module before objdump
2017-06-08 7:31 ` [PATCH v4 7/9] perf test: Decompress kernel module before objdump Namhyung Kim
@ 2017-06-08 7:34 ` Adrian Hunter
2017-06-08 22:52 ` [tip:perf/urgent] perf tests: " tip-bot for Namhyung Kim
1 sibling, 0 replies; 21+ messages in thread
From: Adrian Hunter @ 2017-06-08 7:34 UTC (permalink / raw)
To: Namhyung Kim, Arnaldo Carvalho de Melo
Cc: Ingo Molnar, Peter Zijlstra, Jiri Olsa, LKML, kernel-team,
David Ahern, Wang Nan
On 08/06/17 10:31, Namhyung Kim wrote:
> If a kernel modules is compressed, it should be decompressed before
> running objdump to parse binary data correctly. This fixes a failure of
> object code reading test for me.
>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
> tools/perf/tests/code-reading.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
> index 1f14e7612cbb..94b7c7b02bde 100644
> --- a/tools/perf/tests/code-reading.c
> +++ b/tools/perf/tests/code-reading.c
> @@ -229,6 +229,8 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
> unsigned char buf2[BUFSZ];
> size_t ret_len;
> u64 objdump_addr;
> + const char *objdump_name;
> + char decomp_name[KMOD_DECOMP_LEN];
> int ret;
>
> pr_debug("Reading object code for memory address: %#"PRIx64"\n", addr);
> @@ -289,9 +291,25 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
> state->done[state->done_cnt++] = al.map->start;
> }
>
> + objdump_name = al.map->dso->long_name;
> + if (dso__needs_decompress(al.map->dso)) {
> + if (dso__decompress_kmodule_path(al.map->dso, objdump_name,
> + decomp_name,
> + sizeof(decomp_name)) < 0) {
> + pr_debug("decompression failed\n");
> + return -1;
> + }
> +
> + objdump_name = decomp_name;
> + }
> +
> /* Read the object code using objdump */
> objdump_addr = map__rip_2objdump(al.map, al.addr);
> - ret = read_via_objdump(al.map->dso->long_name, objdump_addr, buf2, len);
> + ret = read_via_objdump(objdump_name, objdump_addr, buf2, len);
> +
> + if (dso__needs_decompress(al.map->dso))
> + unlink(objdump_name);
> +
> if (ret > 0) {
> /*
> * The kernel maps are inaccurate - assume objdump is right in
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4)
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
` (8 preceding siblings ...)
2017-06-08 7:31 ` [PATCH v4 9/9] perf symbols: Kill dso__build_id_is_kmod() Namhyung Kim
@ 2017-06-08 12:10 ` Jiri Olsa
9 siblings, 0 replies; 21+ messages in thread
From: Jiri Olsa @ 2017-06-08 12:10 UTC (permalink / raw)
To: Namhyung Kim
Cc: Arnaldo Carvalho de Melo, Ingo Molnar, Peter Zijlstra, Jiri Olsa,
LKML, kernel-team, David Ahern, Adrian Hunter, Wang Nan
On Thu, Jun 08, 2017 at 04:31:00PM +0900, Namhyung Kim wrote:
> Hello,
>
> This is v4 of my compressed kernel module work. Please take a look.
>
> * changes in v4)
> - fix build-id cache symbolic link handling in annotate
> - separate fix for a memory leak (Arnaldo)
> - consolidate error path in __open_dso (Arnaldo)
> - remove decompressed file after use
>
> The code is avaiable at 'perf/kmod-decomp-v4' branch in my tree:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/namhyung/linux-perf.git
>
> Thanks,
> Namhyung
>
>
> Namhyung Kim (9):
> perf annotate: Fix symbolic link of build-id cache
> perf tools: Fix a memory leak in __open_dso()
> perf tools: Introduce dso__decompress_kmodule_{fd,path}
> perf annotate: Use dso__decompress_kmodule_path()
> perf tools: Decompress kernel module when reading DSO data
> perf tools: Consolidate error path in __open_dso()
> perf test: Decompress kernel module before objdump
> perf symbols: Keep DSO->symtab_type after decompress
> perf symbols: Kill dso__build_id_is_kmod()
Acked-by: Jiri Olsa <jolsa@kernel.org>
thanks,
jirka
^ permalink raw reply [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf annotate: Fix symbolic link of build-id cache
2017-06-08 7:31 ` [PATCH v4 1/9] perf annotate: Fix symbolic link of build-id cache Namhyung Kim
@ 2017-06-08 22:49 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:49 UTC (permalink / raw)
To: linux-tip-commits
Cc: namhyung, dsahern, mingo, a.p.zijlstra, adrian.hunter, wangnan0,
hpa, jolsa, acme, tglx, linux-kernel, treeze.taeung
Commit-ID: 3619ef76b37d4803bc9daee9d03d82c8526db378
Gitweb: http://git.kernel.org/tip/3619ef76b37d4803bc9daee9d03d82c8526db378
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:01 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:38:41 -0300
perf annotate: Fix symbolic link of build-id cache
The commit 6ebd2547dd24 ("perf annotate: Fix a bug following symbolic
link of a build-id file") changed to use dirname to follow the symlink.
But it only considers new-style build-id cache names so old names fail
on readlink() and force to use system path which might not available.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Taeung Song <treeze.taeung@gmail.com>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Fixes: 6ebd2547dd24 ("perf annotate: Fix a bug following symbolic link of a build-id file")
Link: http://lkml.kernel.org/r/20170608073109.30699-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/annotate.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 1367d7e..df4486c 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1321,6 +1321,7 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
char linkname[PATH_MAX];
char *build_id_filename;
char *build_id_path = NULL;
+ char *pos;
if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
!dso__is_kcore(dso))
@@ -1340,7 +1341,14 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
if (!build_id_path)
return -1;
- dirname(build_id_path);
+ /*
+ * old style build-id cache has name of XX/XXXXXXX.. while
+ * new style has XX/XXXXXXX../{elf,kallsyms,vdso}.
+ * extract the build-id part of dirname in the new style only.
+ */
+ pos = strrchr(build_id_path, '/');
+ if (pos && strlen(pos) < SBUILD_ID_SIZE - 2)
+ dirname(build_id_path);
if (dso__is_kcore(dso) ||
readlink(build_id_path, linkname, sizeof(linkname)) < 0 ||
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf tools: Fix a memory leak in __open_dso()
2017-06-08 7:31 ` [PATCH v4 2/9] perf tools: Fix a memory leak in __open_dso() Namhyung Kim
@ 2017-06-08 22:50 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:50 UTC (permalink / raw)
To: linux-tip-commits
Cc: hpa, linux-kernel, adrian.hunter, namhyung, acme, mingo,
wangnan0, tglx, a.p.zijlstra, jolsa, dsahern
Commit-ID: 44ad6b8852529eb39066edbedc027a6901da6803
Gitweb: http://git.kernel.org/tip/44ad6b8852529eb39066edbedc027a6901da6803
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:02 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:38:47 -0300
perf tools: Fix a memory leak in __open_dso()
The 'name' variable should be freed on the error path.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-3-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/dso.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index b27d127..1f29e4f 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -412,8 +412,10 @@ static int __open_dso(struct dso *dso, struct machine *machine)
return -EINVAL;
}
- if (!is_regular_file(name))
+ if (!is_regular_file(name)) {
+ free(name);
return -EINVAL;
+ }
fd = do_open(name);
free(name);
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf tools: Introduce dso__decompress_kmodule_{fd,path}
2017-06-08 7:31 ` [PATCH v4 3/9] perf tools: Introduce dso__decompress_kmodule_{fd,path} Namhyung Kim
@ 2017-06-08 22:50 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:50 UTC (permalink / raw)
To: linux-tip-commits
Cc: jolsa, a.p.zijlstra, dsahern, mingo, adrian.hunter, wangnan0,
hpa, acme, tglx, namhyung, linux-kernel
Commit-ID: 42b3fa670825983fc8bd0ac7b80cc84ae3abb75b
Gitweb: http://git.kernel.org/tip/42b3fa670825983fc8bd0ac7b80cc84ae3abb75b
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:03 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:38:55 -0300
perf tools: Introduce dso__decompress_kmodule_{fd,path}
Move decompress_kmodule() to util/dso.c and split it into two functions
returning fd and (decompressed) file path. The existing user only wants
the fd version but the path version will be used soon.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-4-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/dso.c | 58 ++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/dso.h | 6 +++++
tools/perf/util/symbol-elf.c | 36 +--------------------------
3 files changed, 65 insertions(+), 35 deletions(-)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 1f29e4f..b346b8e 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -248,6 +248,64 @@ bool dso__needs_decompress(struct dso *dso)
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
}
+static int decompress_kmodule(struct dso *dso, const char *name, char *tmpbuf)
+{
+ int fd = -1;
+ struct kmod_path m;
+
+ if (!dso__needs_decompress(dso))
+ return -1;
+
+ if (kmod_path__parse_ext(&m, dso->long_name))
+ return -1;
+
+ if (!m.comp)
+ goto out;
+
+ fd = mkstemp(tmpbuf);
+ if (fd < 0) {
+ dso->load_errno = errno;
+ goto out;
+ }
+
+ if (!decompress_to_file(m.ext, name, fd)) {
+ dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE;
+ close(fd);
+ fd = -1;
+ }
+
+out:
+ free(m.ext);
+ return fd;
+}
+
+int dso__decompress_kmodule_fd(struct dso *dso, const char *name)
+{
+ char tmpbuf[] = KMOD_DECOMP_NAME;
+ int fd;
+
+ fd = decompress_kmodule(dso, name, tmpbuf);
+ unlink(tmpbuf);
+ return fd;
+}
+
+int dso__decompress_kmodule_path(struct dso *dso, const char *name,
+ char *pathname, size_t len)
+{
+ char tmpbuf[] = KMOD_DECOMP_NAME;
+ int fd;
+
+ fd = decompress_kmodule(dso, name, tmpbuf);
+ if (fd < 0) {
+ unlink(tmpbuf);
+ return -1;
+ }
+
+ strncpy(pathname, tmpbuf, len);
+ close(fd);
+ return 0;
+}
+
/*
* Parses kernel module specified in @path and updates
* @m argument like:
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
index 5fe2ab5..bd061ba 100644
--- a/tools/perf/util/dso.h
+++ b/tools/perf/util/dso.h
@@ -244,6 +244,12 @@ bool is_supported_compression(const char *ext);
bool is_kernel_module(const char *pathname, int cpumode);
bool decompress_to_file(const char *ext, const char *filename, int output_fd);
bool dso__needs_decompress(struct dso *dso);
+int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
+int dso__decompress_kmodule_path(struct dso *dso, const char *name,
+ char *pathname, size_t len);
+
+#define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX"
+#define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME)
struct kmod_path {
char *name;
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 1fb2efa..d342e77 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -637,40 +637,6 @@ static int dso__swap_init(struct dso *dso, unsigned char eidata)
return 0;
}
-static int decompress_kmodule(struct dso *dso, const char *name,
- enum dso_binary_type type)
-{
- int fd = -1;
- char tmpbuf[] = "/tmp/perf-kmod-XXXXXX";
- struct kmod_path m;
-
- if (type != DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP &&
- type != DSO_BINARY_TYPE__GUEST_KMODULE_COMP &&
- type != DSO_BINARY_TYPE__BUILD_ID_CACHE)
- return -1;
-
- if (kmod_path__parse_ext(&m, dso->long_name) || !m.comp)
- return -1;
-
- fd = mkstemp(tmpbuf);
- if (fd < 0) {
- dso->load_errno = errno;
- goto out;
- }
-
- if (!decompress_to_file(m.ext, name, fd)) {
- dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE;
- close(fd);
- fd = -1;
- }
-
- unlink(tmpbuf);
-
-out:
- free(m.ext);
- return fd;
-}
-
bool symsrc__possibly_runtime(struct symsrc *ss)
{
return ss->dynsym || ss->opdsec;
@@ -702,7 +668,7 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
int fd;
if (dso__needs_decompress(dso)) {
- fd = decompress_kmodule(dso, name, type);
+ fd = dso__decompress_kmodule_fd(dso, name);
if (fd < 0)
return -1;
} else {
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf annotate: Use dso__decompress_kmodule_path()
2017-06-08 7:31 ` [PATCH v4 4/9] perf annotate: Use dso__decompress_kmodule_path() Namhyung Kim
@ 2017-06-08 22:51 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:51 UTC (permalink / raw)
To: linux-tip-commits
Cc: tglx, wangnan0, acme, linux-kernel, a.p.zijlstra, dsahern, jolsa,
adrian.hunter, hpa, namhyung, mingo
Commit-ID: 3c84fd53044f98017271101b59a21ddb20fb312b
Gitweb: http://git.kernel.org/tip/3c84fd53044f98017271101b59a21ddb20fb312b
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:04 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:39:02 -0300
perf annotate: Use dso__decompress_kmodule_path()
Convert open-coded decompress routine to use the function.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-5-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/annotate.c | 27 +++------------------------
1 file changed, 3 insertions(+), 24 deletions(-)
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index df4486c..ddbd56d 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -1431,31 +1431,10 @@ int symbol__disassemble(struct symbol *sym, struct map *map, const char *arch_na
sizeof(symfs_filename));
}
} else if (dso__needs_decompress(dso)) {
- char tmp[PATH_MAX];
- struct kmod_path m;
- int fd;
- bool ret;
+ char tmp[KMOD_DECOMP_LEN];
- if (kmod_path__parse_ext(&m, symfs_filename))
- goto out;
-
- snprintf(tmp, PATH_MAX, "/tmp/perf-kmod-XXXXXX");
-
- fd = mkstemp(tmp);
- if (fd < 0) {
- free(m.ext);
- goto out;
- }
-
- ret = decompress_to_file(m.ext, symfs_filename, fd);
-
- if (ret)
- pr_err("Cannot decompress %s %s\n", m.ext, symfs_filename);
-
- free(m.ext);
- close(fd);
-
- if (!ret)
+ if (dso__decompress_kmodule_path(dso, symfs_filename,
+ tmp, sizeof(tmp)) < 0)
goto out;
strcpy(symfs_filename, tmp);
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf tools: Decompress kernel module when reading DSO data
2017-06-08 7:31 ` [PATCH v4 5/9] perf tools: Decompress kernel module when reading DSO data Namhyung Kim
@ 2017-06-08 22:51 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:51 UTC (permalink / raw)
To: linux-tip-commits
Cc: tglx, linux-kernel, namhyung, mingo, dsahern, jolsa,
a.p.zijlstra, acme, adrian.hunter, hpa, wangnan0
Commit-ID: 1d6b3c9ba756a5134fd7ad1959acac776d17404b
Gitweb: http://git.kernel.org/tip/1d6b3c9ba756a5134fd7ad1959acac776d17404b
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:05 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:39:07 -0300
perf tools: Decompress kernel module when reading DSO data
Currently perf decompresses kernel modules when loading the symbol table
but it missed to do it when reading raw data.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-6-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/dso.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index b346b8e..c63525d 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -475,7 +475,23 @@ static int __open_dso(struct dso *dso, struct machine *machine)
return -EINVAL;
}
+ if (dso__needs_decompress(dso)) {
+ char newpath[KMOD_DECOMP_LEN];
+ size_t len = sizeof(newpath);
+
+ if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) {
+ free(name);
+ return -dso->load_errno;
+ }
+
+ strcpy(name, newpath);
+ }
+
fd = do_open(name);
+
+ if (dso__needs_decompress(dso))
+ unlink(name);
+
free(name);
return fd;
}
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf tools: Consolidate error path in __open_dso()
2017-06-08 7:31 ` [PATCH v4 6/9] perf tools: Consolidate error path in __open_dso() Namhyung Kim
@ 2017-06-08 22:52 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:52 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, namhyung, dsahern, mingo, tglx, adrian.hunter,
wangnan0, jolsa, hpa, a.p.zijlstra, acme
Commit-ID: 8ba29adf9a7cdff3c7283d5fc0dcf5e777d3b40f
Gitweb: http://git.kernel.org/tip/8ba29adf9a7cdff3c7283d5fc0dcf5e777d3b40f
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:06 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:39:13 -0300
perf tools: Consolidate error path in __open_dso()
On failure, it should free the 'name', so clean up the error path using
goto.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Suggested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-7-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/dso.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index c63525d..4e7ab61 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -454,7 +454,7 @@ static int do_open(char *name)
static int __open_dso(struct dso *dso, struct machine *machine)
{
- int fd;
+ int fd = -EINVAL;
char *root_dir = (char *)"";
char *name = malloc(PATH_MAX);
@@ -465,23 +465,19 @@ static int __open_dso(struct dso *dso, struct machine *machine)
root_dir = machine->root_dir;
if (dso__read_binary_type_filename(dso, dso->binary_type,
- root_dir, name, PATH_MAX)) {
- free(name);
- return -EINVAL;
- }
+ root_dir, name, PATH_MAX))
+ goto out;
- if (!is_regular_file(name)) {
- free(name);
- return -EINVAL;
- }
+ if (!is_regular_file(name))
+ goto out;
if (dso__needs_decompress(dso)) {
char newpath[KMOD_DECOMP_LEN];
size_t len = sizeof(newpath);
if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) {
- free(name);
- return -dso->load_errno;
+ fd = -dso->load_errno;
+ goto out;
}
strcpy(name, newpath);
@@ -492,6 +488,7 @@ static int __open_dso(struct dso *dso, struct machine *machine)
if (dso__needs_decompress(dso))
unlink(name);
+out:
free(name);
return fd;
}
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf tests: Decompress kernel module before objdump
2017-06-08 7:31 ` [PATCH v4 7/9] perf test: Decompress kernel module before objdump Namhyung Kim
2017-06-08 7:34 ` Adrian Hunter
@ 2017-06-08 22:52 ` tip-bot for Namhyung Kim
1 sibling, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:52 UTC (permalink / raw)
To: linux-tip-commits
Cc: dsahern, wangnan0, acme, linux-kernel, tglx, adrian.hunter,
jolsa, a.p.zijlstra, mingo, namhyung, hpa
Commit-ID: 94df1040b1e6aacd8dec0ba3c61d7e77cd695f26
Gitweb: http://git.kernel.org/tip/94df1040b1e6aacd8dec0ba3c61d7e77cd695f26
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:07 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:39:19 -0300
perf tests: Decompress kernel module before objdump
If a kernel modules is compressed, it should be decompressed before
running objdump to parse binary data correctly. This fixes a failure of
object code reading test for me.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-8-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/tests/code-reading.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 1f14e76..94b7c7b 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -229,6 +229,8 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
unsigned char buf2[BUFSZ];
size_t ret_len;
u64 objdump_addr;
+ const char *objdump_name;
+ char decomp_name[KMOD_DECOMP_LEN];
int ret;
pr_debug("Reading object code for memory address: %#"PRIx64"\n", addr);
@@ -289,9 +291,25 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
state->done[state->done_cnt++] = al.map->start;
}
+ objdump_name = al.map->dso->long_name;
+ if (dso__needs_decompress(al.map->dso)) {
+ if (dso__decompress_kmodule_path(al.map->dso, objdump_name,
+ decomp_name,
+ sizeof(decomp_name)) < 0) {
+ pr_debug("decompression failed\n");
+ return -1;
+ }
+
+ objdump_name = decomp_name;
+ }
+
/* Read the object code using objdump */
objdump_addr = map__rip_2objdump(al.map, al.addr);
- ret = read_via_objdump(al.map->dso->long_name, objdump_addr, buf2, len);
+ ret = read_via_objdump(objdump_name, objdump_addr, buf2, len);
+
+ if (dso__needs_decompress(al.map->dso))
+ unlink(objdump_name);
+
if (ret > 0) {
/*
* The kernel maps are inaccurate - assume objdump is right in
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf symbols: Keep DSO->symtab_type after decompress
2017-06-08 7:31 ` [PATCH v4 8/9] perf symbols: Keep DSO->symtab_type after decompress Namhyung Kim
@ 2017-06-08 22:53 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:53 UTC (permalink / raw)
To: linux-tip-commits
Cc: wangnan0, a.p.zijlstra, jolsa, mingo, linux-kernel, tglx,
dsahern, acme, adrian.hunter, hpa, namhyung
Commit-ID: c25ec42f846f702f8f532fbc890171e3a1f6ec85
Gitweb: http://git.kernel.org/tip/c25ec42f846f702f8f532fbc890171e3a1f6ec85
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:08 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:39:26 -0300
perf symbols: Keep DSO->symtab_type after decompress
The symsrc__init() overwrites dso->symtab_type as symsrc->type in
dso__load_sym(). But for compressed kernel modules in the build-id
cache, it should have original symtab type to be decompressed as needed.
This fixes perf annotate to show disassembly of the function properly.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-9-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/symbol-elf.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index d342e77..502505c 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -671,6 +671,8 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
fd = dso__decompress_kmodule_fd(dso, name);
if (fd < 0)
return -1;
+
+ type = dso->symtab_type;
} else {
fd = open(name, O_RDONLY);
if (fd < 0) {
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [tip:perf/urgent] perf symbols: Kill dso__build_id_is_kmod()
2017-06-08 7:31 ` [PATCH v4 9/9] perf symbols: Kill dso__build_id_is_kmod() Namhyung Kim
@ 2017-06-08 22:53 ` tip-bot for Namhyung Kim
0 siblings, 0 replies; 21+ messages in thread
From: tip-bot for Namhyung Kim @ 2017-06-08 22:53 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, tglx, mingo, jolsa, namhyung, adrian.hunter, hpa,
dsahern, acme, wangnan0, a.p.zijlstra
Commit-ID: b89fe63fbafe307fb72546f7a2320380bf41bdd4
Gitweb: http://git.kernel.org/tip/b89fe63fbafe307fb72546f7a2320380bf41bdd4
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Thu, 8 Jun 2017 16:31:09 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Thu, 8 Jun 2017 15:39:34 -0300
perf symbols: Kill dso__build_id_is_kmod()
The commit e7ee40475760 ("perf symbols: Fix symbols searching for module
in buildid-cache") added the function to check kernel modules reside in
the build-id cache. This was because there's no way to identify a DSO
which is actually a kernel module. So it searched linkname of the file
and find ".ko" suffix.
But this does not work for compressed kernel modules and now such DSOs
hCcave correct symtab_type now. So no need to check it anymore. This
patch essentially reverts the commit.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: kernel-team@lge.com
Link: http://lkml.kernel.org/r/20170608073109.30699-10-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/build-id.c | 45 ---------------------------------------------
tools/perf/util/build-id.h | 1 -
tools/perf/util/symbol.c | 4 ----
3 files changed, 50 deletions(-)
diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c
index 168cc49..e0148b0 100644
--- a/tools/perf/util/build-id.c
+++ b/tools/perf/util/build-id.c
@@ -278,51 +278,6 @@ char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size)
return bf;
}
-bool dso__build_id_is_kmod(const struct dso *dso, char *bf, size_t size)
-{
- char *id_name = NULL, *ch;
- struct stat sb;
- char sbuild_id[SBUILD_ID_SIZE];
-
- if (!dso->has_build_id)
- goto err;
-
- build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
- id_name = build_id_cache__linkname(sbuild_id, NULL, 0);
- if (!id_name)
- goto err;
- if (access(id_name, F_OK))
- goto err;
- if (lstat(id_name, &sb) == -1)
- goto err;
- if ((size_t)sb.st_size > size - 1)
- goto err;
- if (readlink(id_name, bf, size - 1) < 0)
- goto err;
-
- bf[sb.st_size] = '\0';
-
- /*
- * link should be:
- * ../../lib/modules/4.4.0-rc4/kernel/net/ipv4/netfilter/nf_nat_ipv4.ko/a09fe3eb3147dafa4e3b31dbd6257e4d696bdc92
- */
- ch = strrchr(bf, '/');
- if (!ch)
- goto err;
- if (ch - 3 < bf)
- goto err;
-
- free(id_name);
- return strncmp(".ko", ch - 3, 3) == 0;
-err:
- pr_err("Invalid build id: %s\n", id_name ? :
- dso->long_name ? :
- dso->short_name ? :
- "[unknown]");
- free(id_name);
- return false;
-}
-
#define dsos__for_each_with_build_id(pos, head) \
list_for_each_entry(pos, head, node) \
if (!pos->has_build_id) \
diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h
index 8a89b19..96690a5 100644
--- a/tools/perf/util/build-id.h
+++ b/tools/perf/util/build-id.h
@@ -17,7 +17,6 @@ char *build_id_cache__kallsyms_path(const char *sbuild_id, char *bf,
size_t size);
char *dso__build_id_filename(const struct dso *dso, char *bf, size_t size);
-bool dso__build_id_is_kmod(const struct dso *dso, char *bf, size_t size);
int build_id__mark_dso_hit(struct perf_tool *tool, union perf_event *event,
struct perf_sample *sample, struct perf_evsel *evsel,
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 8f2b068..e7a98db 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1562,10 +1562,6 @@ int dso__load(struct dso *dso, struct map *map)
if (!runtime_ss && syms_ss)
runtime_ss = syms_ss;
- if (syms_ss && syms_ss->type == DSO_BINARY_TYPE__BUILD_ID_CACHE)
- if (dso__build_id_is_kmod(dso, name, PATH_MAX))
- kmod = true;
-
if (syms_ss)
ret = dso__load_sym(dso, map, syms_ss, runtime_ss, kmod);
else
^ permalink raw reply related [flat|nested] 21+ messages in thread
end of thread, other threads:[~2017-06-08 22:56 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-08 7:31 [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 1/9] perf annotate: Fix symbolic link of build-id cache Namhyung Kim
2017-06-08 22:49 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 2/9] perf tools: Fix a memory leak in __open_dso() Namhyung Kim
2017-06-08 22:50 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 3/9] perf tools: Introduce dso__decompress_kmodule_{fd,path} Namhyung Kim
2017-06-08 22:50 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 4/9] perf annotate: Use dso__decompress_kmodule_path() Namhyung Kim
2017-06-08 22:51 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 5/9] perf tools: Decompress kernel module when reading DSO data Namhyung Kim
2017-06-08 22:51 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 6/9] perf tools: Consolidate error path in __open_dso() Namhyung Kim
2017-06-08 22:52 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 7/9] perf test: Decompress kernel module before objdump Namhyung Kim
2017-06-08 7:34 ` Adrian Hunter
2017-06-08 22:52 ` [tip:perf/urgent] perf tests: " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 8/9] perf symbols: Keep DSO->symtab_type after decompress Namhyung Kim
2017-06-08 22:53 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 7:31 ` [PATCH v4 9/9] perf symbols: Kill dso__build_id_is_kmod() Namhyung Kim
2017-06-08 22:53 ` [tip:perf/urgent] " tip-bot for Namhyung Kim
2017-06-08 12:10 ` [PATCHSET 0/9] perf tools: Fix for compressed kernel modules (v4) Jiri Olsa
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).