From: Greg Kroah-Hartman Date: Mon, 2 May 2022 23:05:41 +0000 (+0200) Subject: 5.17-stable patches X-Git-Tag: v5.4.192~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a44008e92915e7507fb13c9d78eb6e85497568c0;p=thirdparty%2Fkernel%2Fstable-queue.git 5.17-stable patches added patches: perf-symbol-pass-is_kallsyms-to-symbols__fixup_end.patch perf-symbol-remove-arch__symbols__fixup_end.patch perf-symbol-update-symbols__fixup_end.patch --- diff --git a/queue-5.17/perf-symbol-pass-is_kallsyms-to-symbols__fixup_end.patch b/queue-5.17/perf-symbol-pass-is_kallsyms-to-symbols__fixup_end.patch new file mode 100644 index 00000000000..4629a7bb4eb --- /dev/null +++ b/queue-5.17/perf-symbol-pass-is_kallsyms-to-symbols__fixup_end.patch @@ -0,0 +1,99 @@ +From 838425f2defe5262906b698752d28fd2fca1aac2 Mon Sep 17 00:00:00 2001 +From: Namhyung Kim +Date: Fri, 15 Apr 2022 17:40:46 -0700 +Subject: perf symbol: Pass is_kallsyms to symbols__fixup_end() + +From: Namhyung Kim + +commit 838425f2defe5262906b698752d28fd2fca1aac2 upstream. + +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. + +Fixes: 3cf6a32f3f2a4594 ("perf symbols: Fix symbol size calculation condition") +Signed-off-by: Namhyung Kim +Acked-by: Ian Rogers +Cc: Heiko Carstens +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: John Garry +Cc: Leo Yan +Cc: Mark Rutland +Cc: Masami Hiramatsu +Cc: Mathieu Poirier +Cc: Michael Ellerman +Cc: Michael Petlan +Cc: Peter Zijlstra +Cc: Song Liu +Cc: Will Deacon +Cc: linux-s390@vger.kernel.org +Cc: linuxppc-dev@lists.ozlabs.org +Link: https://lore.kernel.org/r/20220416004048.1514900-2-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman +--- + 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(-) + +--- 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, + * 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) { + /* +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -217,7 +217,8 @@ again: + } + } + +-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 + 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 *ds + #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; + +--- a/tools/perf/util/symbol.h ++++ b/tools/perf/util/symbol.h +@@ -203,7 +203,7 @@ void __symbols__insert(struct rb_root_ca + 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); diff --git a/queue-5.17/perf-symbol-remove-arch__symbols__fixup_end.patch b/queue-5.17/perf-symbol-remove-arch__symbols__fixup_end.patch new file mode 100644 index 00000000000..edbc588fd73 --- /dev/null +++ b/queue-5.17/perf-symbol-remove-arch__symbols__fixup_end.patch @@ -0,0 +1,155 @@ +From a5d20d42a2f2dc2b2f9e9361912062732414090d Mon Sep 17 00:00:00 2001 +From: Namhyung Kim +Date: Fri, 15 Apr 2022 17:40:48 -0700 +Subject: perf symbol: Remove arch__symbols__fixup_end() + +From: Namhyung Kim + +commit a5d20d42a2f2dc2b2f9e9361912062732414090d upstream. + +Now the generic code can handle kallsyms fixup properly so no need to +keep the arch-functions anymore. + +Fixes: 3cf6a32f3f2a4594 ("perf symbols: Fix symbol size calculation condition") +Signed-off-by: Namhyung Kim +Acked-by: Ian Rogers +Cc: Heiko Carstens +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: John Garry +Cc: Leo Yan +Cc: Mark Rutland +Cc: Masami Hiramatsu +Cc: Mathieu Poirier +Cc: Michael Ellerman +Cc: Michael Petlan +Cc: Peter Zijlstra +Cc: Song Liu +Cc: Will Deacon +Cc: linux-s390@vger.kernel.org +Cc: linuxppc-dev@lists.ozlabs.org +Link: https://lore.kernel.org/r/20220416004048.1514900-4-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/arch/arm64/util/machine.c | 21 --------------------- + tools/perf/arch/powerpc/util/Build | 1 - + tools/perf/arch/powerpc/util/machine.c | 25 ------------------------- + tools/perf/arch/s390/util/machine.c | 16 ---------------- + tools/perf/util/symbol.c | 5 ----- + tools/perf/util/symbol.h | 1 - + 6 files changed, 69 deletions(-) + delete mode 100644 tools/perf/arch/powerpc/util/machine.c + +--- a/tools/perf/arch/arm64/util/machine.c ++++ b/tools/perf/arch/arm64/util/machine.c +@@ -8,27 +8,6 @@ + #include "callchain.h" + #include "record.h" + +-/* On arm64, kernel text segment starts at high memory address, +- * for example 0xffff 0000 8xxx xxxx. Modules start at a low memory +- * address, like 0xffff 0000 00ax xxxx. When only small amount of +- * memory is used by modules, gap between end of module's text segment +- * and start of kernel text segment may reach 2G. +- * Therefore do not fill this gap and do not assign it to the kernel dso map. +- */ +- +-#define SYMBOL_LIMIT (1 << 12) /* 4K */ +- +-void arch__symbols__fixup_end(struct symbol *p, struct symbol *c) +-{ +- if ((strchr(p->name, '[') && strchr(c->name, '[') == NULL) || +- (strchr(p->name, '[') == NULL && strchr(c->name, '['))) +- /* Limit range of last symbol in module and kernel */ +- p->end += SYMBOL_LIMIT; +- else +- p->end = c->start; +- pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end); +-} +- + void arch__add_leaf_frame_record_opts(struct record_opts *opts) + { + opts->sample_user_regs |= sample_reg_masks[PERF_REG_ARM64_LR].mask; +--- a/tools/perf/arch/powerpc/util/Build ++++ b/tools/perf/arch/powerpc/util/Build +@@ -1,5 +1,4 @@ + perf-y += header.o +-perf-y += machine.o + perf-y += kvm-stat.o + perf-y += perf_regs.o + perf-y += mem-events.o +--- a/tools/perf/arch/powerpc/util/machine.c ++++ /dev/null +@@ -1,25 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +- +-#include +-#include +-#include +-#include // page_size +-#include "debug.h" +-#include "symbol.h" +- +-/* On powerpc kernel text segment start at memory addresses, 0xc000000000000000 +- * whereas the modules are located at very high memory addresses, +- * for example 0xc00800000xxxxxxx. The gap between end of kernel text segment +- * and beginning of first module's text segment is very high. +- * Therefore do not fill this gap and do not assign it to the kernel dso map. +- */ +- +-void arch__symbols__fixup_end(struct symbol *p, struct symbol *c) +-{ +- if (strchr(p->name, '[') == NULL && strchr(c->name, '[')) +- /* Limit the range of last kernel symbol */ +- p->end += page_size; +- else +- p->end = c->start; +- pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end); +-} +--- a/tools/perf/arch/s390/util/machine.c ++++ b/tools/perf/arch/s390/util/machine.c +@@ -35,19 +35,3 @@ int arch__fix_module_text_start(u64 *sta + + return 0; + } +- +-/* On s390 kernel text segment start is located at very low memory addresses, +- * for example 0x10000. Modules are located at very high memory addresses, +- * for example 0x3ff xxxx xxxx. The gap between end of kernel text segment +- * and beginning of first module's text segment is very big. +- * Therefore do not fill this gap and do not assign it to the kernel dso map. +- */ +-void arch__symbols__fixup_end(struct symbol *p, struct symbol *c) +-{ +- if (strchr(p->name, '[') == NULL && strchr(c->name, '[')) +- /* Last kernel symbol mapped to end of page */ +- p->end = roundup(p->end, page_size); +- else +- p->end = c->start; +- pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end); +-} +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -101,11 +101,6 @@ static int prefix_underscores_count(cons + return tail - str; + } + +-void __weak arch__symbols__fixup_end(struct symbol *p, struct symbol *c) +-{ +- p->end = c->start; +-} +- + const char * __weak arch__normalize_symbol_name(const char *name) + { + return name; +--- a/tools/perf/util/symbol.h ++++ b/tools/perf/util/symbol.h +@@ -241,7 +241,6 @@ const char *arch__normalize_symbol_name( + #define SYMBOL_A 0 + #define SYMBOL_B 1 + +-void arch__symbols__fixup_end(struct symbol *p, struct symbol *c); + int arch__compare_symbol_names(const char *namea, const char *nameb); + int arch__compare_symbol_names_n(const char *namea, const char *nameb, + unsigned int n); diff --git a/queue-5.17/perf-symbol-update-symbols__fixup_end.patch b/queue-5.17/perf-symbol-update-symbols__fixup_end.patch new file mode 100644 index 00000000000..06f50ef7b88 --- /dev/null +++ b/queue-5.17/perf-symbol-update-symbols__fixup_end.patch @@ -0,0 +1,85 @@ +From 8799ebce84d672aae1dc3170510f6a3e66f96b11 Mon Sep 17 00:00:00 2001 +From: Namhyung Kim +Date: Fri, 15 Apr 2022 17:40:47 -0700 +Subject: perf symbol: Update symbols__fixup_end() + +From: Namhyung Kim + +commit 8799ebce84d672aae1dc3170510f6a3e66f96b11 upstream. + +Now arch-specific functions all do the same thing. When it fixes the +symbol address it needs to check the boundary between the kernel image +and modules. For the last symbol in the previous region, it cannot +know the exact size as it's discarded already. Thus it just uses a +small page size (4096) and rounds it up like the last symbol. + +Fixes: 3cf6a32f3f2a4594 ("perf symbols: Fix symbol size calculation condition") +Signed-off-by: Namhyung Kim +Acked-by: Ian Rogers +Cc: Heiko Carstens +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: John Garry +Cc: Leo Yan +Cc: Mark Rutland +Cc: Masami Hiramatsu +Cc: Mathieu Poirier +Cc: Michael Ellerman +Cc: Michael Petlan +Cc: Peter Zijlstra +Cc: Song Liu +Cc: Will Deacon +Cc: linux-s390@vger.kernel.org +Cc: linuxppc-dev@lists.ozlabs.org +Link: https://lore.kernel.org/r/20220416004048.1514900-3-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/util/symbol.c | 29 +++++++++++++++++++++++++---- + 1 file changed, 25 insertions(+), 4 deletions(-) + +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -217,8 +217,8 @@ again: + } + } + +-void symbols__fixup_end(struct rb_root_cached *symbols, +- bool is_kallsyms __maybe_unused) ++/* Update zero-sized symbols using the address of the next symbol */ ++void symbols__fixup_end(struct rb_root_cached *symbols, bool is_kallsyms) + { + struct rb_node *nd, *prevnd = rb_first_cached(symbols); + struct symbol *curr, *prev; +@@ -232,8 +232,29 @@ void symbols__fixup_end(struct rb_root_c + prev = curr; + curr = rb_entry(nd, struct symbol, rb_node); + +- if (prev->end == prev->start || prev->end != curr->start) +- arch__symbols__fixup_end(prev, curr); ++ /* ++ * On some architecture kernel text segment start is located at ++ * some low memory address, while modules are located at high ++ * memory addresses (or vice versa). The gap between end of ++ * kernel text segment and beginning of first module's text ++ * segment is very big. Therefore do not fill this gap and do ++ * not assign it to the kernel dso map (kallsyms). ++ * ++ * In kallsyms, it determines module symbols using '[' character ++ * like in: ++ * ffffffffc1937000 T hdmi_driver_init [snd_hda_codec_hdmi] ++ */ ++ if (prev->end == prev->start) { ++ /* Last kernel/module symbol mapped to end of page */ ++ if (is_kallsyms && (!strchr(prev->name, '[') != ++ !strchr(curr->name, '['))) ++ prev->end = roundup(prev->end + 4096, 4096); ++ else ++ prev->end = curr->start; ++ ++ pr_debug4("%s sym:%s end:%#" PRIx64 "\n", ++ __func__, prev->name, prev->end); ++ } + } + + /* Last entry */ diff --git a/queue-5.17/series b/queue-5.17/series index 6c6520d37d3..19d7dee2567 100644 --- a/queue-5.17/series +++ b/queue-5.17/series @@ -195,3 +195,6 @@ btrfs-zoned-use-dedicated-lock-for-data-relocation.patch btrfs-fix-assertion-failure-during-scrub-due-to-block-group-reallocation.patch arm-dts-at91-sama7g5ek-enable-pull-up-on-flexcom3-console-lines.patch arm-dts-imx8mm-venice-gw-71xx-72xx-73xx-fix-otg-controller-oc-mode.patch +perf-symbol-pass-is_kallsyms-to-symbols__fixup_end.patch +perf-symbol-update-symbols__fixup_end.patch +perf-symbol-remove-arch__symbols__fixup_end.patch