[PATCH 1/3] perf symbol: Pass is_kallsyms to symbols__fixup_end()
Ian Rogers
irogers at google.com
Sun Apr 17 00:59:27 AEST 2022
On Fri, Apr 15, 2022 at 8:40 PM Namhyung Kim <namhyung at kernel.org> wrote:
>
> The symbol fixup is necessary for symbols in kallsyms since they don't
> have size info. So we use the next symbol's address to calculate the
> size. Now it's also used for user binaries because sometimes they
> miss size for hand-written asm functions.
>
> There's a arch-specific function to handle kallsyms differently but
> currently it cannot distinguish kallsyms from others. Pass this
> information explicitly to handle it properly. Note that those arch
> functions will be moved to the generic function so I didn't added it
> to the arch-functions.
Thanks Namhyung, in:
https://lore.kernel.org/linux-perf-users/20220412154817.2728324-3-irogers@google.com/
I used "dso->kernel != DSO_SPACE__USER" in symbol-elf to make this
more than just kallsyms as presumably kernel code is the issue. Do we
know elf kernel code has correctly sized symbols?
Thanks,
Ian
> Signed-off-by: Namhyung Kim <namhyung at kernel.org>
> ---
> tools/perf/util/symbol-elf.c | 2 +-
> tools/perf/util/symbol.c | 7 ++++---
> tools/perf/util/symbol.h | 2 +-
> 3 files changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
> index 31cd59a2b66e..ecd377938eea 100644
> --- a/tools/perf/util/symbol-elf.c
> +++ b/tools/perf/util/symbol-elf.c
> @@ -1290,7 +1290,7 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss,
> * For misannotated, zeroed, ASM function sizes.
> */
> if (nr > 0) {
> - symbols__fixup_end(&dso->symbols);
> + symbols__fixup_end(&dso->symbols, false);
> symbols__fixup_duplicate(&dso->symbols);
> if (kmap) {
> /*
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index dea0fc495185..1b85cc1422a9 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -217,7 +217,8 @@ void symbols__fixup_duplicate(struct rb_root_cached *symbols)
> }
> }
>
> -void symbols__fixup_end(struct rb_root_cached *symbols)
> +void symbols__fixup_end(struct rb_root_cached *symbols,
> + bool is_kallsyms __maybe_unused)
> {
> struct rb_node *nd, *prevnd = rb_first_cached(symbols);
> struct symbol *curr, *prev;
> @@ -1467,7 +1468,7 @@ int __dso__load_kallsyms(struct dso *dso, const char *filename,
> if (kallsyms__delta(kmap, filename, &delta))
> return -1;
>
> - symbols__fixup_end(&dso->symbols);
> + symbols__fixup_end(&dso->symbols, true);
> symbols__fixup_duplicate(&dso->symbols);
>
> if (dso->kernel == DSO_SPACE__KERNEL_GUEST)
> @@ -1659,7 +1660,7 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
> #undef bfd_asymbol_section
> #endif
>
> - symbols__fixup_end(&dso->symbols);
> + symbols__fixup_end(&dso->symbols, false);
> symbols__fixup_duplicate(&dso->symbols);
> dso->adjust_symbols = 1;
>
> diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
> index fbf866d82dcc..5fcdd1f94c56 100644
> --- a/tools/perf/util/symbol.h
> +++ b/tools/perf/util/symbol.h
> @@ -203,7 +203,7 @@ void __symbols__insert(struct rb_root_cached *symbols, struct symbol *sym,
> bool kernel);
> void symbols__insert(struct rb_root_cached *symbols, struct symbol *sym);
> void symbols__fixup_duplicate(struct rb_root_cached *symbols);
> -void symbols__fixup_end(struct rb_root_cached *symbols);
> +void symbols__fixup_end(struct rb_root_cached *symbols, bool is_kallsyms);
> void maps__fixup_end(struct maps *maps);
>
> typedef int (*mapfn_t)(u64 start, u64 len, u64 pgoff, void *data);
> --
> 2.36.0.rc0.470.gd361397f0d-goog
>
More information about the Linuxppc-dev
mailing list