From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
Thomas Richter <tmricht@linux.vnet.ibm.com>,
Hendrik Brueckner <brueckner@linux.vnet.ibm.com>,
Zvonko Kosic <zvonko.kosic@de.ibm.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 18/19] perf report: Fix module symbol adjustment for s390x
Date: Mon, 14 Aug 2017 13:27:40 -0300 [thread overview]
Message-ID: <20170814162741.6101-19-acme@kernel.org> (raw)
In-Reply-To: <20170814162741.6101-1-acme@kernel.org>
From: Thomas Richter <tmricht@linux.vnet.ibm.com>
The 'perf report' tool does not display the addresses of kernel module
symbols correctly.
For example symbol qeth_send_ipa_cmd in kernel module qeth.ko has this
relative address for function qeth_send_ipa_cmd():
[root@s8360047 linux]# nm -g drivers/s390/net/qeth.ko | fgrep send_ipa_cmd
0000000000013088 T qeth_send_ipa_cmd
The module is loaded at address:
[root@s8360047 linux]# cat /sys/module/qeth/sections/.text
0x000003ff80296d20
[root@s8360047 linux]#
This should result in a start address of:
0x13088 + 0x3ff80296d20 = 0x3ff802a9da8
Using crash to verify the address on a live system:
[root@s8360046 linux]# crash vmlinux
crash 7.1.9++
Copyright (C) 2002-2016 Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation
[...]
crash> mod -s qeth drivers/s390/net/qeth.ko
MODULE NAME SIZE OBJECT FILE
3ff8028d700 qeth 151552 drivers/s390/net/qeth.ko
crash> sym qeth_send_ipa_cmd
3ff802a9da8 (T) qeth_send_ipa_cmd [qeth] /root/linux/drivers/s390/net/qeth_core_main.c: 2944
crash>
Now perf report displays the address of symbol qeth_send_ipa_cmd:
symbol__new:
qeth_send_ipa_cmd 0x130f0-0x132ce
There is a difference of 0x68 between the entry in the symbol table (see
nm command above) and perf. The difference is from the offset the .text
segment of qeth.ko:
[root@s8360047 perf]# readelf -a drivers/s390/net/qeth.ko
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .note.gnu.build-i NOTE 0000000000000000 00000040
0000000000000024 0000000000000000 A 0 0 4
[ 2] .text PROGBITS 0000000000000000 00000068
000000000001c8a0 0000000000000000 AX 0 0 8
As seen the .text segment has an offset of 0x68 with start address 0x0.
Therefore 0x68 is added to the address of qeth_send_ipa_cmd and thus
0x13088 + 0x68 = 0x130f0 is displayed.
This is wrong, perf report needs to display the start address of symbol
qeth_send_ipa_cmd at 0x13088 + qeth.ko.text section start address.
The qeth.ko module .text start address is available in the qeth.ko DSO
map. Just identify the kernel module symbols and correct the addresses.
With the fix I see this correct address for symbol: symbol__new:
qeth_send_ipa_cmd 0x3ff802a9da8-0x3ff802a9f86
Signed-off-by: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com>
Reviewed-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Cc: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com>
Cc: Zvonko Kosic <zvonko.kosic@de.ibm.com>
LPU-Reference: 20170803134902.47207-1-tmricht@linux.vnet.ibm.com
Link: http://lkml.kernel.org/n/tip-q8lktlpoxb5e3dj52u1s1rw4@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/arch/s390/util/sym-handling.c | 7 +++++++
tools/perf/util/symbol-elf.c | 8 +++++++-
tools/perf/util/symbol.h | 3 +++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/tools/perf/arch/s390/util/sym-handling.c b/tools/perf/arch/s390/util/sym-handling.c
index b6cd056ccf71..e103f6e46afe 100644
--- a/tools/perf/arch/s390/util/sym-handling.c
+++ b/tools/perf/arch/s390/util/sym-handling.c
@@ -19,4 +19,11 @@ bool elf__needs_adjust_symbols(GElf_Ehdr ehdr)
return ehdr.e_type == ET_REL || ehdr.e_type == ET_DYN;
}
+void arch__adjust_sym_map_offset(GElf_Sym *sym,
+ GElf_Shdr *shdr __maybe_unused,
+ struct map *map)
+{
+ if (map->type == MAP__FUNCTION)
+ sym->st_value += map->start;
+}
#endif
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 98deabb9b47e..a70479061fce 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -793,6 +793,12 @@ static u64 ref_reloc(struct kmap *kmap)
void __weak arch__sym_update(struct symbol *s __maybe_unused,
GElf_Sym *sym __maybe_unused) { }
+void __weak arch__adjust_sym_map_offset(GElf_Sym *sym, GElf_Shdr *shdr,
+ struct map *map __maybe_unused)
+{
+ sym->st_value -= shdr->sh_addr - shdr->sh_offset;
+}
+
int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
struct symsrc *runtime_ss, int kmodule)
{
@@ -973,7 +979,7 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
/* Adjust symbol to map to file offset */
if (adjust_kernel_syms)
- sym.st_value -= shdr.sh_addr - shdr.sh_offset;
+ arch__adjust_sym_map_offset(&sym, &shdr, map);
if (strcmp(section_name,
(curr_dso->short_name +
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index b221671070e2..d00a012cfdfb 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -343,6 +343,9 @@ int setup_intlist(struct intlist **list, const char *list_str,
#ifdef HAVE_LIBELF_SUPPORT
bool elf__needs_adjust_symbols(GElf_Ehdr ehdr);
void arch__sym_update(struct symbol *s, GElf_Sym *sym);
+void arch__adjust_sym_map_offset(GElf_Sym *sym,
+ GElf_Shdr *shdr __maybe_unused,
+ struct map *map __maybe_unused);
#endif
#define SYMBOL_A 0
--
2.13.4
next prev parent reply other threads:[~2017-08-14 16:27 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-14 16:27 [GIT PULL 00/19] perf/core improvements and fixes Arnaldo Carvalho de Melo
2017-08-14 16:27 ` Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 01/19] perf scripting python: Add ppc64le to audit uname list Arnaldo Carvalho de Melo
2017-08-14 16:27 ` Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 02/19] perf vendor events powerpc: remove suffix in mapfile Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 03/19] perf vendor events powerpc: Update POWER9 events Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 04/19] perf stat: Fix saved values rbtree lookup Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 05/19] perf tools: Add missing newline to expr parser error messages Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 06/19] perf test: Make 'list' subcommand match main 'perf test' numbering/matching Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 07/19] perf test: Add 'struct test *' to the test functions Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 08/19] perf test: Add infrastructure to run shell based tests Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 09/19] perf test: Make 'list' use same filtering code as main 'perf test' Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 10/19] perf test shell: Add 'probe_vfs_getname' shell test Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 11/19] perf test shell: Install shell tests Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 12/19] perf test shell: Move vfs_getname probe function to lib Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 13/19] perf test shell: Add test using probe:vfs_getname and verifying results Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 14/19] perf test shell: Add test using vfs_getname + 'perf trace' Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 15/19] perf util: Take elf_name as const string in dso__demangle_sym Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 16/19] perf srcline: Do not consider empty files as valid srclines Arnaldo Carvalho de Melo
2017-08-14 16:27 ` [PATCH 17/19] perf record: Fix wrong size in perf_record_mmap for last kernel module Arnaldo Carvalho de Melo
2017-08-14 16:27 ` Arnaldo Carvalho de Melo [this message]
2017-08-14 16:27 ` [PATCH 19/19] perf test shell: Add uprobes + backtrace ping test Arnaldo Carvalho de Melo
2017-08-14 17:39 ` [GIT PULL 00/19] perf/core improvements and fixes Ingo Molnar
2017-08-14 17:39 ` Ingo Molnar
2017-08-14 17:52 ` Arnaldo Carvalho de Melo
2017-08-14 17:52 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170814162741.6101-19-acme@kernel.org \
--to=acme@kernel.org \
--cc=acme@redhat.com \
--cc=brueckner@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=tmricht@linux.vnet.ibm.com \
--cc=zvonko.kosic@de.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.