* [PATCH] tools/perf: Fix dso kernel load and symbol process to correctly map dso to its long_name, type and adjust_symbols
@ 2023-08-11 5:15 ` Athira Rajeev
0 siblings, 0 replies; 6+ messages in thread
From: Athira Rajeev @ 2023-08-11 5:15 UTC (permalink / raw)
To: acme, jolsa, irogers, namhyung
Cc: linux-perf-users, linuxppc-dev, maddy, atrajeev, kjain, disgoel,
Adrian Hunter
Test "object cocde reading" fails sometimes for kernel address
as below:
Reading object code for memory address: 0xc000000000004c3c
File is: [kernel.kallsyms]
On file address is: 0x14c3c
dso__data_read_offset failed
test child finished with -1
---- end ----
Object code reading: FAILED!
Here the dso__data_read_offset fails for symbol address
0xc000000000004c3c. This is because, the dso long_name here
is [kernel.kallsyms] and hence open_dso fails to open this
file. There is an incorrect dso to map handling here. The
key points here is:
- dso long_name is set to [kernel.kallsyms]. This file is
not present and hence returns error
- DSO binary type is set to DSO_BINARY_TYPE__NOT_FOUND
- dso adjust_symbols is set to zero
In the end dso__data_read_offset() returns -1 and the address
0x14c3c can not be resolved. Hence the test fails. But the
address actually maps to kernel dso
# objdump -z -d --start-address=0xc000000000004c3c --stop-address=0xc000000000004cbc /home/athira/linux/vmlinux
/home/athira/linux/vmlinux: file format elf64-powerpcle
Disassembly of section .head.text:
c000000000004c3c <exc_virt_0x4c00_system_call+0x3c>:
c000000000004c3c: a6 02 9b 7d mfsrr1 r12
c000000000004c40: 78 13 42 7c mr r2,r2
c000000000004c44: 18 00 4d e9 ld r10,24(r13)
c000000000004c48: 60 c6 4a 61 ori r10,r10,50784
c000000000004c4c: a6 03 49 7d mtctr r10
Fix the dso__process_kernel_symbol function to set the
binary_type and adjust_symbols. adjust_symbols is used by
function "map__rip_2objdump" which converts symbol start
address to objdump address. Also set the dso long_name during
dso__load_vmlinux function.
Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
---
Note: Found similar discussion here in thread:
https://www.spinics.net/lists/linux-perf-users/msg06337.html
where Adrian proposed the fix, but looks like this was
not added to the perf. Hence addeed Suggested-by from Adrian.
Additional to the fix proposed by Adrian, the patch also
adds setting of adjust_symbols which is needed for
map__rip_2objdump to convert symbol start to objdump address.
tools/perf/util/symbol-elf.c | 2 ++
tools/perf/util/symbol.c | 15 ++++++++++-----
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 252d26a59e64..9e7eeaf616b8 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -1440,6 +1440,8 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
curr_dso->kernel = dso->kernel;
curr_dso->long_name = dso->long_name;
curr_dso->long_name_len = dso->long_name_len;
+ curr_dso->binary_type = dso->binary_type;
+ curr_dso->adjust_symbols = dso->adjust_symbols;
curr_map = map__new2(start, curr_dso);
dso__put(curr_dso);
if (curr_map == NULL)
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index f849f9ef68e6..3f36675b7c8f 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -2204,15 +2204,20 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
return -1;
+ /*
+ * dso__load_sym() may copy 'dso' which will result in the copies having
+ * an incorrect long name unless we set it here first.
+ */
+ dso__set_long_name(dso, vmlinux, vmlinux_allocated);
+ if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
+ dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
+ else
+ dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
+
err = dso__load_sym(dso, map, &ss, &ss, 0);
symsrc__destroy(&ss);
if (err > 0) {
- if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
- dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
- else
- dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
- dso__set_long_name(dso, vmlinux, vmlinux_allocated);
dso__set_loaded(dso);
pr_debug("Using %s for symbols\n", symfs_vmlinux);
}
--
2.31.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH] tools/perf: Fix dso kernel load and symbol process to correctly map dso to its long_name, type and adjust_symbols
@ 2023-08-11 5:15 ` Athira Rajeev
0 siblings, 0 replies; 6+ messages in thread
From: Athira Rajeev @ 2023-08-11 5:15 UTC (permalink / raw)
To: acme, jolsa, irogers, namhyung
Cc: atrajeev, kjain, Adrian Hunter, linux-perf-users, maddy, disgoel,
linuxppc-dev
Test "object cocde reading" fails sometimes for kernel address
as below:
Reading object code for memory address: 0xc000000000004c3c
File is: [kernel.kallsyms]
On file address is: 0x14c3c
dso__data_read_offset failed
test child finished with -1
---- end ----
Object code reading: FAILED!
Here the dso__data_read_offset fails for symbol address
0xc000000000004c3c. This is because, the dso long_name here
is [kernel.kallsyms] and hence open_dso fails to open this
file. There is an incorrect dso to map handling here. The
key points here is:
- dso long_name is set to [kernel.kallsyms]. This file is
not present and hence returns error
- DSO binary type is set to DSO_BINARY_TYPE__NOT_FOUND
- dso adjust_symbols is set to zero
In the end dso__data_read_offset() returns -1 and the address
0x14c3c can not be resolved. Hence the test fails. But the
address actually maps to kernel dso
# objdump -z -d --start-address=0xc000000000004c3c --stop-address=0xc000000000004cbc /home/athira/linux/vmlinux
/home/athira/linux/vmlinux: file format elf64-powerpcle
Disassembly of section .head.text:
c000000000004c3c <exc_virt_0x4c00_system_call+0x3c>:
c000000000004c3c: a6 02 9b 7d mfsrr1 r12
c000000000004c40: 78 13 42 7c mr r2,r2
c000000000004c44: 18 00 4d e9 ld r10,24(r13)
c000000000004c48: 60 c6 4a 61 ori r10,r10,50784
c000000000004c4c: a6 03 49 7d mtctr r10
Fix the dso__process_kernel_symbol function to set the
binary_type and adjust_symbols. adjust_symbols is used by
function "map__rip_2objdump" which converts symbol start
address to objdump address. Also set the dso long_name during
dso__load_vmlinux function.
Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
---
Note: Found similar discussion here in thread:
https://www.spinics.net/lists/linux-perf-users/msg06337.html
where Adrian proposed the fix, but looks like this was
not added to the perf. Hence addeed Suggested-by from Adrian.
Additional to the fix proposed by Adrian, the patch also
adds setting of adjust_symbols which is needed for
map__rip_2objdump to convert symbol start to objdump address.
tools/perf/util/symbol-elf.c | 2 ++
tools/perf/util/symbol.c | 15 ++++++++++-----
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index 252d26a59e64..9e7eeaf616b8 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -1440,6 +1440,8 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
curr_dso->kernel = dso->kernel;
curr_dso->long_name = dso->long_name;
curr_dso->long_name_len = dso->long_name_len;
+ curr_dso->binary_type = dso->binary_type;
+ curr_dso->adjust_symbols = dso->adjust_symbols;
curr_map = map__new2(start, curr_dso);
dso__put(curr_dso);
if (curr_map == NULL)
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index f849f9ef68e6..3f36675b7c8f 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -2204,15 +2204,20 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
return -1;
+ /*
+ * dso__load_sym() may copy 'dso' which will result in the copies having
+ * an incorrect long name unless we set it here first.
+ */
+ dso__set_long_name(dso, vmlinux, vmlinux_allocated);
+ if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
+ dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
+ else
+ dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
+
err = dso__load_sym(dso, map, &ss, &ss, 0);
symsrc__destroy(&ss);
if (err > 0) {
- if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
- dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
- else
- dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
- dso__set_long_name(dso, vmlinux, vmlinux_allocated);
dso__set_loaded(dso);
pr_debug("Using %s for symbols\n", symfs_vmlinux);
}
--
2.31.1
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] tools/perf: Fix dso kernel load and symbol process to correctly map dso to its long_name, type and adjust_symbols
2023-08-11 5:15 ` Athira Rajeev
@ 2023-08-11 9:49 ` Adrian Hunter
-1 siblings, 0 replies; 6+ messages in thread
From: Adrian Hunter @ 2023-08-11 9:49 UTC (permalink / raw)
To: Athira Rajeev, acme, jolsa, irogers, namhyung
Cc: linux-perf-users, linuxppc-dev, maddy, kjain, disgoel
On 11/08/23 08:15, Athira Rajeev wrote:
> Test "object cocde reading" fails sometimes for kernel address
> as below:
>
> Reading object code for memory address: 0xc000000000004c3c
> File is: [kernel.kallsyms]
> On file address is: 0x14c3c
> dso__data_read_offset failed
> test child finished with -1
> ---- end ----
> Object code reading: FAILED!
>
> Here the dso__data_read_offset fails for symbol address
> 0xc000000000004c3c. This is because, the dso long_name here
> is [kernel.kallsyms] and hence open_dso fails to open this
> file. There is an incorrect dso to map handling here. The
> key points here is:
> - dso long_name is set to [kernel.kallsyms]. This file is
> not present and hence returns error
> - DSO binary type is set to DSO_BINARY_TYPE__NOT_FOUND
> - dso adjust_symbols is set to zero
>
> In the end dso__data_read_offset() returns -1 and the address
> 0x14c3c can not be resolved. Hence the test fails. But the
> address actually maps to kernel dso
>
> # objdump -z -d --start-address=0xc000000000004c3c --stop-address=0xc000000000004cbc /home/athira/linux/vmlinux
>
> /home/athira/linux/vmlinux: file format elf64-powerpcle
>
> Disassembly of section .head.text:
>
> c000000000004c3c <exc_virt_0x4c00_system_call+0x3c>:
> c000000000004c3c: a6 02 9b 7d mfsrr1 r12
> c000000000004c40: 78 13 42 7c mr r2,r2
> c000000000004c44: 18 00 4d e9 ld r10,24(r13)
> c000000000004c48: 60 c6 4a 61 ori r10,r10,50784
> c000000000004c4c: a6 03 49 7d mtctr r10
>
> Fix the dso__process_kernel_symbol function to set the
> binary_type and adjust_symbols. adjust_symbols is used by
> function "map__rip_2objdump" which converts symbol start
> address to objdump address. Also set the dso long_name during
> dso__load_vmlinux function.
>
> Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
> Note: Found similar discussion here in thread:
> https://www.spinics.net/lists/linux-perf-users/msg06337.html
> where Adrian proposed the fix, but looks like this was
> not added to the perf. Hence addeed Suggested-by from Adrian.
>
> Additional to the fix proposed by Adrian, the patch also
> adds setting of adjust_symbols which is needed for
> map__rip_2objdump to convert symbol start to objdump address.
>
> tools/perf/util/symbol-elf.c | 2 ++
> tools/perf/util/symbol.c | 15 ++++++++++-----
> 2 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
> index 252d26a59e64..9e7eeaf616b8 100644
> --- a/tools/perf/util/symbol-elf.c
> +++ b/tools/perf/util/symbol-elf.c
> @@ -1440,6 +1440,8 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
> curr_dso->kernel = dso->kernel;
> curr_dso->long_name = dso->long_name;
> curr_dso->long_name_len = dso->long_name_len;
> + curr_dso->binary_type = dso->binary_type;
> + curr_dso->adjust_symbols = dso->adjust_symbols;
> curr_map = map__new2(start, curr_dso);
> dso__put(curr_dso);
> if (curr_map == NULL)
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index f849f9ef68e6..3f36675b7c8f 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -2204,15 +2204,20 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
> if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
> return -1;
>
> + /*
> + * dso__load_sym() may copy 'dso' which will result in the copies having
> + * an incorrect long name unless we set it here first.
> + */
> + dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> + if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> + dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> + else
> + dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> +
> err = dso__load_sym(dso, map, &ss, &ss, 0);
> symsrc__destroy(&ss);
>
> if (err > 0) {
> - if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> - dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> - else
> - dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> - dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> dso__set_loaded(dso);
> pr_debug("Using %s for symbols\n", symfs_vmlinux);
> }
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] tools/perf: Fix dso kernel load and symbol process to correctly map dso to its long_name, type and adjust_symbols
@ 2023-08-11 9:49 ` Adrian Hunter
0 siblings, 0 replies; 6+ messages in thread
From: Adrian Hunter @ 2023-08-11 9:49 UTC (permalink / raw)
To: Athira Rajeev, acme, jolsa, irogers, namhyung
Cc: linux-perf-users, kjain, maddy, linuxppc-dev, disgoel
On 11/08/23 08:15, Athira Rajeev wrote:
> Test "object cocde reading" fails sometimes for kernel address
> as below:
>
> Reading object code for memory address: 0xc000000000004c3c
> File is: [kernel.kallsyms]
> On file address is: 0x14c3c
> dso__data_read_offset failed
> test child finished with -1
> ---- end ----
> Object code reading: FAILED!
>
> Here the dso__data_read_offset fails for symbol address
> 0xc000000000004c3c. This is because, the dso long_name here
> is [kernel.kallsyms] and hence open_dso fails to open this
> file. There is an incorrect dso to map handling here. The
> key points here is:
> - dso long_name is set to [kernel.kallsyms]. This file is
> not present and hence returns error
> - DSO binary type is set to DSO_BINARY_TYPE__NOT_FOUND
> - dso adjust_symbols is set to zero
>
> In the end dso__data_read_offset() returns -1 and the address
> 0x14c3c can not be resolved. Hence the test fails. But the
> address actually maps to kernel dso
>
> # objdump -z -d --start-address=0xc000000000004c3c --stop-address=0xc000000000004cbc /home/athira/linux/vmlinux
>
> /home/athira/linux/vmlinux: file format elf64-powerpcle
>
> Disassembly of section .head.text:
>
> c000000000004c3c <exc_virt_0x4c00_system_call+0x3c>:
> c000000000004c3c: a6 02 9b 7d mfsrr1 r12
> c000000000004c40: 78 13 42 7c mr r2,r2
> c000000000004c44: 18 00 4d e9 ld r10,24(r13)
> c000000000004c48: 60 c6 4a 61 ori r10,r10,50784
> c000000000004c4c: a6 03 49 7d mtctr r10
>
> Fix the dso__process_kernel_symbol function to set the
> binary_type and adjust_symbols. adjust_symbols is used by
> function "map__rip_2objdump" which converts symbol start
> address to objdump address. Also set the dso long_name during
> dso__load_vmlinux function.
>
> Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
> Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
> Note: Found similar discussion here in thread:
> https://www.spinics.net/lists/linux-perf-users/msg06337.html
> where Adrian proposed the fix, but looks like this was
> not added to the perf. Hence addeed Suggested-by from Adrian.
>
> Additional to the fix proposed by Adrian, the patch also
> adds setting of adjust_symbols which is needed for
> map__rip_2objdump to convert symbol start to objdump address.
>
> tools/perf/util/symbol-elf.c | 2 ++
> tools/perf/util/symbol.c | 15 ++++++++++-----
> 2 files changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
> index 252d26a59e64..9e7eeaf616b8 100644
> --- a/tools/perf/util/symbol-elf.c
> +++ b/tools/perf/util/symbol-elf.c
> @@ -1440,6 +1440,8 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
> curr_dso->kernel = dso->kernel;
> curr_dso->long_name = dso->long_name;
> curr_dso->long_name_len = dso->long_name_len;
> + curr_dso->binary_type = dso->binary_type;
> + curr_dso->adjust_symbols = dso->adjust_symbols;
> curr_map = map__new2(start, curr_dso);
> dso__put(curr_dso);
> if (curr_map == NULL)
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index f849f9ef68e6..3f36675b7c8f 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -2204,15 +2204,20 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
> if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
> return -1;
>
> + /*
> + * dso__load_sym() may copy 'dso' which will result in the copies having
> + * an incorrect long name unless we set it here first.
> + */
> + dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> + if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> + dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> + else
> + dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> +
> err = dso__load_sym(dso, map, &ss, &ss, 0);
> symsrc__destroy(&ss);
>
> if (err > 0) {
> - if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> - dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> - else
> - dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> - dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> dso__set_loaded(dso);
> pr_debug("Using %s for symbols\n", symfs_vmlinux);
> }
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] tools/perf: Fix dso kernel load and symbol process to correctly map dso to its long_name, type and adjust_symbols
2023-08-11 9:49 ` Adrian Hunter
@ 2023-08-11 13:46 ` Arnaldo Carvalho de Melo
-1 siblings, 0 replies; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2023-08-11 13:46 UTC (permalink / raw)
To: Adrian Hunter
Cc: Athira Rajeev, jolsa, irogers, namhyung, linux-perf-users,
linuxppc-dev, maddy, kjain, disgoel
Em Fri, Aug 11, 2023 at 12:49:35PM +0300, Adrian Hunter escreveu:
> On 11/08/23 08:15, Athira Rajeev wrote:
> > Test "object cocde reading" fails sometimes for kernel address
> > as below:
> >
> > Reading object code for memory address: 0xc000000000004c3c
> > File is: [kernel.kallsyms]
> > On file address is: 0x14c3c
> > dso__data_read_offset failed
> > test child finished with -1
> > ---- end ----
> > Object code reading: FAILED!
> >
> > Here the dso__data_read_offset fails for symbol address
> > 0xc000000000004c3c. This is because, the dso long_name here
> > is [kernel.kallsyms] and hence open_dso fails to open this
> > file. There is an incorrect dso to map handling here. The
> > key points here is:
> > - dso long_name is set to [kernel.kallsyms]. This file is
> > not present and hence returns error
> > - DSO binary type is set to DSO_BINARY_TYPE__NOT_FOUND
> > - dso adjust_symbols is set to zero
> >
> > In the end dso__data_read_offset() returns -1 and the address
> > 0x14c3c can not be resolved. Hence the test fails. But the
> > address actually maps to kernel dso
> >
> > # objdump -z -d --start-address=0xc000000000004c3c --stop-address=0xc000000000004cbc /home/athira/linux/vmlinux
> >
> > /home/athira/linux/vmlinux: file format elf64-powerpcle
> >
> > Disassembly of section .head.text:
> >
> > c000000000004c3c <exc_virt_0x4c00_system_call+0x3c>:
> > c000000000004c3c: a6 02 9b 7d mfsrr1 r12
> > c000000000004c40: 78 13 42 7c mr r2,r2
> > c000000000004c44: 18 00 4d e9 ld r10,24(r13)
> > c000000000004c48: 60 c6 4a 61 ori r10,r10,50784
> > c000000000004c4c: a6 03 49 7d mtctr r10
> >
> > Fix the dso__process_kernel_symbol function to set the
> > binary_type and adjust_symbols. adjust_symbols is used by
> > function "map__rip_2objdump" which converts symbol start
> > address to objdump address. Also set the dso long_name during
> > dso__load_vmlinux function.
> >
> > Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
> > Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
>
> Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Thanks, applied.
- Arnaldo
> > ---
> > Note: Found similar discussion here in thread:
> > https://www.spinics.net/lists/linux-perf-users/msg06337.html
> > where Adrian proposed the fix, but looks like this was
> > not added to the perf. Hence addeed Suggested-by from Adrian.
> >
> > Additional to the fix proposed by Adrian, the patch also
> > adds setting of adjust_symbols which is needed for
> > map__rip_2objdump to convert symbol start to objdump address.
> >
> > tools/perf/util/symbol-elf.c | 2 ++
> > tools/perf/util/symbol.c | 15 ++++++++++-----
> > 2 files changed, 12 insertions(+), 5 deletions(-)
> >
> > diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
> > index 252d26a59e64..9e7eeaf616b8 100644
> > --- a/tools/perf/util/symbol-elf.c
> > +++ b/tools/perf/util/symbol-elf.c
> > @@ -1440,6 +1440,8 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
> > curr_dso->kernel = dso->kernel;
> > curr_dso->long_name = dso->long_name;
> > curr_dso->long_name_len = dso->long_name_len;
> > + curr_dso->binary_type = dso->binary_type;
> > + curr_dso->adjust_symbols = dso->adjust_symbols;
> > curr_map = map__new2(start, curr_dso);
> > dso__put(curr_dso);
> > if (curr_map == NULL)
> > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> > index f849f9ef68e6..3f36675b7c8f 100644
> > --- a/tools/perf/util/symbol.c
> > +++ b/tools/perf/util/symbol.c
> > @@ -2204,15 +2204,20 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
> > if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
> > return -1;
> >
> > + /*
> > + * dso__load_sym() may copy 'dso' which will result in the copies having
> > + * an incorrect long name unless we set it here first.
> > + */
> > + dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> > + if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> > + dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> > + else
> > + dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> > +
> > err = dso__load_sym(dso, map, &ss, &ss, 0);
> > symsrc__destroy(&ss);
> >
> > if (err > 0) {
> > - if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> > - dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> > - else
> > - dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> > - dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> > dso__set_loaded(dso);
> > pr_debug("Using %s for symbols\n", symfs_vmlinux);
> > }
>
--
- Arnaldo
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] tools/perf: Fix dso kernel load and symbol process to correctly map dso to its long_name, type and adjust_symbols
@ 2023-08-11 13:46 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 6+ messages in thread
From: Arnaldo Carvalho de Melo @ 2023-08-11 13:46 UTC (permalink / raw)
To: Adrian Hunter
Cc: irogers, Athira Rajeev, kjain, linux-perf-users, maddy, jolsa,
namhyung, disgoel, linuxppc-dev
Em Fri, Aug 11, 2023 at 12:49:35PM +0300, Adrian Hunter escreveu:
> On 11/08/23 08:15, Athira Rajeev wrote:
> > Test "object cocde reading" fails sometimes for kernel address
> > as below:
> >
> > Reading object code for memory address: 0xc000000000004c3c
> > File is: [kernel.kallsyms]
> > On file address is: 0x14c3c
> > dso__data_read_offset failed
> > test child finished with -1
> > ---- end ----
> > Object code reading: FAILED!
> >
> > Here the dso__data_read_offset fails for symbol address
> > 0xc000000000004c3c. This is because, the dso long_name here
> > is [kernel.kallsyms] and hence open_dso fails to open this
> > file. There is an incorrect dso to map handling here. The
> > key points here is:
> > - dso long_name is set to [kernel.kallsyms]. This file is
> > not present and hence returns error
> > - DSO binary type is set to DSO_BINARY_TYPE__NOT_FOUND
> > - dso adjust_symbols is set to zero
> >
> > In the end dso__data_read_offset() returns -1 and the address
> > 0x14c3c can not be resolved. Hence the test fails. But the
> > address actually maps to kernel dso
> >
> > # objdump -z -d --start-address=0xc000000000004c3c --stop-address=0xc000000000004cbc /home/athira/linux/vmlinux
> >
> > /home/athira/linux/vmlinux: file format elf64-powerpcle
> >
> > Disassembly of section .head.text:
> >
> > c000000000004c3c <exc_virt_0x4c00_system_call+0x3c>:
> > c000000000004c3c: a6 02 9b 7d mfsrr1 r12
> > c000000000004c40: 78 13 42 7c mr r2,r2
> > c000000000004c44: 18 00 4d e9 ld r10,24(r13)
> > c000000000004c48: 60 c6 4a 61 ori r10,r10,50784
> > c000000000004c4c: a6 03 49 7d mtctr r10
> >
> > Fix the dso__process_kernel_symbol function to set the
> > binary_type and adjust_symbols. adjust_symbols is used by
> > function "map__rip_2objdump" which converts symbol start
> > address to objdump address. Also set the dso long_name during
> > dso__load_vmlinux function.
> >
> > Suggested-by: Adrian Hunter <adrian.hunter@intel.com>
> > Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
>
> Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Thanks, applied.
- Arnaldo
> > ---
> > Note: Found similar discussion here in thread:
> > https://www.spinics.net/lists/linux-perf-users/msg06337.html
> > where Adrian proposed the fix, but looks like this was
> > not added to the perf. Hence addeed Suggested-by from Adrian.
> >
> > Additional to the fix proposed by Adrian, the patch also
> > adds setting of adjust_symbols which is needed for
> > map__rip_2objdump to convert symbol start to objdump address.
> >
> > tools/perf/util/symbol-elf.c | 2 ++
> > tools/perf/util/symbol.c | 15 ++++++++++-----
> > 2 files changed, 12 insertions(+), 5 deletions(-)
> >
> > diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
> > index 252d26a59e64..9e7eeaf616b8 100644
> > --- a/tools/perf/util/symbol-elf.c
> > +++ b/tools/perf/util/symbol-elf.c
> > @@ -1440,6 +1440,8 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,
> > curr_dso->kernel = dso->kernel;
> > curr_dso->long_name = dso->long_name;
> > curr_dso->long_name_len = dso->long_name_len;
> > + curr_dso->binary_type = dso->binary_type;
> > + curr_dso->adjust_symbols = dso->adjust_symbols;
> > curr_map = map__new2(start, curr_dso);
> > dso__put(curr_dso);
> > if (curr_map == NULL)
> > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> > index f849f9ef68e6..3f36675b7c8f 100644
> > --- a/tools/perf/util/symbol.c
> > +++ b/tools/perf/util/symbol.c
> > @@ -2204,15 +2204,20 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,
> > if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
> > return -1;
> >
> > + /*
> > + * dso__load_sym() may copy 'dso' which will result in the copies having
> > + * an incorrect long name unless we set it here first.
> > + */
> > + dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> > + if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> > + dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> > + else
> > + dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> > +
> > err = dso__load_sym(dso, map, &ss, &ss, 0);
> > symsrc__destroy(&ss);
> >
> > if (err > 0) {
> > - if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> > - dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
> > - else
> > - dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
> > - dso__set_long_name(dso, vmlinux, vmlinux_allocated);
> > dso__set_loaded(dso);
> > pr_debug("Using %s for symbols\n", symfs_vmlinux);
> > }
>
--
- Arnaldo
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-08-11 13:48 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-11 5:15 [PATCH] tools/perf: Fix dso kernel load and symbol process to correctly map dso to its long_name, type and adjust_symbols Athira Rajeev
2023-08-11 5:15 ` Athira Rajeev
2023-08-11 9:49 ` Adrian Hunter
2023-08-11 9:49 ` Adrian Hunter
2023-08-11 13:46 ` Arnaldo Carvalho de Melo
2023-08-11 13:46 ` Arnaldo Carvalho de Melo
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.