]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.17-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 2 May 2022 23:05:41 +0000 (01:05 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 2 May 2022 23:05:41 +0000 (01:05 +0200)
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

queue-5.17/perf-symbol-pass-is_kallsyms-to-symbols__fixup_end.patch [new file with mode: 0644]
queue-5.17/perf-symbol-remove-arch__symbols__fixup_end.patch [new file with mode: 0644]
queue-5.17/perf-symbol-update-symbols__fixup_end.patch [new file with mode: 0644]
queue-5.17/series

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 (file)
index 0000000..4629a7b
--- /dev/null
@@ -0,0 +1,99 @@
+From 838425f2defe5262906b698752d28fd2fca1aac2 Mon Sep 17 00:00:00 2001
+From: Namhyung Kim <namhyung@kernel.org>
+Date: Fri, 15 Apr 2022 17:40:46 -0700
+Subject: perf symbol: Pass is_kallsyms to symbols__fixup_end()
+
+From: Namhyung Kim <namhyung@kernel.org>
+
+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 <namhyung@kernel.org>
+Acked-by: Ian Rogers <irogers@google.com>
+Cc: Heiko Carstens <hca@linux.ibm.com>
+Cc: Ingo Molnar <mingo@kernel.org>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: John Garry <john.garry@huawei.com>
+Cc: Leo Yan <leo.yan@linaro.org>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Masami Hiramatsu <mhiramat@kernel.org>
+Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
+Cc: Michael Ellerman <mpe@ellerman.id.au>
+Cc: Michael Petlan <mpetlan@redhat.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Song Liu <songliubraving@fb.com>
+Cc: Will Deacon <will@kernel.org>
+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 <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.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(-)
+
+--- 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 (file)
index 0000000..edbc588
--- /dev/null
@@ -0,0 +1,155 @@
+From a5d20d42a2f2dc2b2f9e9361912062732414090d Mon Sep 17 00:00:00 2001
+From: Namhyung Kim <namhyung@kernel.org>
+Date: Fri, 15 Apr 2022 17:40:48 -0700
+Subject: perf symbol: Remove arch__symbols__fixup_end()
+
+From: Namhyung Kim <namhyung@kernel.org>
+
+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 <namhyung@kernel.org>
+Acked-by: Ian Rogers <irogers@google.com>
+Cc: Heiko Carstens <hca@linux.ibm.com>
+Cc: Ingo Molnar <mingo@kernel.org>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: John Garry <john.garry@huawei.com>
+Cc: Leo Yan <leo.yan@linaro.org>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Masami Hiramatsu <mhiramat@kernel.org>
+Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
+Cc: Michael Ellerman <mpe@ellerman.id.au>
+Cc: Michael Petlan <mpetlan@redhat.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Song Liu <songliubraving@fb.com>
+Cc: Will Deacon <will@kernel.org>
+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 <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 <inttypes.h>
+-#include <stdio.h>
+-#include <string.h>
+-#include <internal/lib.h> // 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 (file)
index 0000000..06f50ef
--- /dev/null
@@ -0,0 +1,85 @@
+From 8799ebce84d672aae1dc3170510f6a3e66f96b11 Mon Sep 17 00:00:00 2001
+From: Namhyung Kim <namhyung@kernel.org>
+Date: Fri, 15 Apr 2022 17:40:47 -0700
+Subject: perf symbol: Update symbols__fixup_end()
+
+From: Namhyung Kim <namhyung@kernel.org>
+
+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 <namhyung@kernel.org>
+Acked-by: Ian Rogers <irogers@google.com>
+Cc: Heiko Carstens <hca@linux.ibm.com>
+Cc: Ingo Molnar <mingo@kernel.org>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: John Garry <john.garry@huawei.com>
+Cc: Leo Yan <leo.yan@linaro.org>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Masami Hiramatsu <mhiramat@kernel.org>
+Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
+Cc: Michael Ellerman <mpe@ellerman.id.au>
+Cc: Michael Petlan <mpetlan@redhat.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Song Liu <songliubraving@fb.com>
+Cc: Will Deacon <will@kernel.org>
+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 <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 */
index 6c6520d37d309ae0b3082cffb6d78da81ffbc959..19d7dee25673dd85233d8d4644e21392a6c1bad1 100644 (file)
@@ -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