]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 31 Oct 2023 12:53:01 +0000 (13:53 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 31 Oct 2023 12:53:01 +0000 (13:53 +0100)
added patches:
x86-mm-fix-reserve_brk-for-older-binutils.patch
x86-mm-simplify-reserve_brk.patch

queue-5.15/series
queue-5.15/x86-mm-fix-reserve_brk-for-older-binutils.patch [new file with mode: 0644]
queue-5.15/x86-mm-simplify-reserve_brk.patch [new file with mode: 0644]

index 96cc3def9faa773f246c6d72858818da8023665b..a0b3e61082c153cbef3346d72b41e9322c3347cf 100644 (file)
@@ -75,3 +75,5 @@ iio-afe-rescale-add-offset-support.patch
 iio-afe-rescale-accept-only-offset-channels.patch
 gve-fix-gfp-flags-when-allocing-pages.patch
 x86-i8259-skip-probing-when-acpi-madt-advertises-pcat-compatibility.patch
+x86-mm-simplify-reserve_brk.patch
+x86-mm-fix-reserve_brk-for-older-binutils.patch
diff --git a/queue-5.15/x86-mm-fix-reserve_brk-for-older-binutils.patch b/queue-5.15/x86-mm-fix-reserve_brk-for-older-binutils.patch
new file mode 100644 (file)
index 0000000..8de55ab
--- /dev/null
@@ -0,0 +1,144 @@
+From 372ecf8b299adbe1ae8916e25b67139034b71211 Mon Sep 17 00:00:00 2001
+From: Josh Poimboeuf <jpoimboe@kernel.org>
+Date: Thu, 9 Jun 2022 00:17:32 -0700
+Subject: x86/mm: Fix RESERVE_BRK() for older binutils
+
+From: Josh Poimboeuf <jpoimboe@kernel.org>
+
+commit e32683c6f7d22ba624e0bfc58b02cf3348bdca63 upstream.
+
+With binutils 2.26, RESERVE_BRK() causes a build failure:
+
+  /tmp/ccnGOKZ5.s: Assembler messages:
+  /tmp/ccnGOKZ5.s:98: Error: missing ')'
+  /tmp/ccnGOKZ5.s:98: Error: missing ')'
+  /tmp/ccnGOKZ5.s:98: Error: missing ')'
+  /tmp/ccnGOKZ5.s:98: Error: junk at end of line, first unrecognized
+  character is `U'
+
+The problem is this line:
+
+  RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE)
+
+Specifically, the INIT_PGT_BUF_SIZE macro which (via PAGE_SIZE's use
+_AC()) has a "1UL", which makes older versions of the assembler unhappy.
+Unfortunately the _AC() macro doesn't work for inline asm.
+
+Inline asm was only needed here to convince the toolchain to add the
+STT_NOBITS flag.  However, if a C variable is placed in a section whose
+name is prefixed with ".bss", GCC and Clang automatically set
+STT_NOBITS.  In fact, ".bss..page_aligned" already relies on this trick.
+
+So fix the build failure (and simplify the macro) by allocating the
+variable in C.
+
+Also, add NOLOAD to the ".brk" output section clause in the linker
+script.  This is a failsafe in case the ".bss" prefix magic trick ever
+stops working somehow.  If there's a section type mismatch, the GNU
+linker will force the ".brk" output section to be STT_NOBITS.  The LLVM
+linker will fail with a "section type mismatch" error.
+
+Note this also changes the name of the variable from .brk.##name to
+__brk_##name.  The variable names aren't actually used anywhere, so it's
+harmless.
+
+Fixes: a1e2c031ec39 ("x86/mm: Simplify RESERVE_BRK()")
+Reported-by: Joe Damato <jdamato@fastly.com>
+Reported-by: Byungchul Park <byungchul.park@lge.com>
+Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Tested-by: Joe Damato <jdamato@fastly.com>
+Link: https://lore.kernel.org/r/22d07a44c80d8e8e1e82b9a806ddc8c6bbb2606e.1654759036.git.jpoimboe@kernel.org
+Signed-off-by: Nathan Chancellor <nathan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/setup.h  |   38 +++++++++++++++++++++-----------------
+ arch/x86/kernel/setup.c       |    5 -----
+ arch/x86/kernel/vmlinux.lds.S |    4 ++--
+ 3 files changed, 23 insertions(+), 24 deletions(-)
+
+--- a/arch/x86/include/asm/setup.h
++++ b/arch/x86/include/asm/setup.h
+@@ -108,19 +108,16 @@ extern unsigned long _brk_end;
+ void *extend_brk(size_t size, size_t align);
+ /*
+- * Reserve space in the brk section.  The name must be unique within the file,
+- * and somewhat descriptive.  The size is in bytes.
++ * Reserve space in the .brk section, which is a block of memory from which the
++ * caller is allowed to allocate very early (before even memblock is available)
++ * by calling extend_brk().  All allocated memory will be eventually converted
++ * to memblock.  Any leftover unallocated memory will be freed.
+  *
+- * The allocation is done using inline asm (rather than using a section
+- * attribute on a normal variable) in order to allow the use of @nobits, so
+- * that it doesn't take up any space in the vmlinux file.
++ * The size is in bytes.
+  */
+-#define RESERVE_BRK(name, size)                                               \
+-      asm(".pushsection .brk_reservation,\"aw\",@nobits\n\t"          \
+-          ".brk." #name ":\n\t"                                       \
+-          ".skip " __stringify(size) "\n\t"                           \
+-          ".size .brk." #name ", " __stringify(size) "\n\t"           \
+-          ".popsection\n\t")
++#define RESERVE_BRK(name, size)                                       \
++      __section(".bss..brk") __aligned(1) __used      \
++      static char __brk_##name[size]
+ extern void probe_roms(void);
+ #ifdef __i386__
+@@ -133,12 +130,19 @@ asmlinkage void __init x86_64_start_rese
+ #endif /* __i386__ */
+ #endif /* _SETUP */
+-#else
+-#define RESERVE_BRK(name,sz)                          \
+-      .pushsection .brk_reservation,"aw",@nobits;     \
+-.brk.name:                                            \
+-1:    .skip sz;                                       \
+-      .size .brk.name,.-1b;                           \
++
++#else  /* __ASSEMBLY */
++
++.macro __RESERVE_BRK name, size
++      .pushsection .bss..brk, "aw"
++SYM_DATA_START(__brk_\name)
++      .skip \size
++SYM_DATA_END(__brk_\name)
+       .popsection
++.endm
++
++#define RESERVE_BRK(name, size) __RESERVE_BRK name, size
++
+ #endif /* __ASSEMBLY__ */
++
+ #endif /* _ASM_X86_SETUP_H */
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -66,11 +66,6 @@ RESERVE_BRK(dmi_alloc, 65536);
+ #endif
+-/*
+- * Range of the BSS area. The size of the BSS area is determined
+- * at link time, with RESERVE_BRK() facility reserving additional
+- * chunks.
+- */
+ unsigned long _brk_start = (unsigned long)__brk_base;
+ unsigned long _brk_end   = (unsigned long)__brk_base;
+--- a/arch/x86/kernel/vmlinux.lds.S
++++ b/arch/x86/kernel/vmlinux.lds.S
+@@ -411,10 +411,10 @@ SECTIONS
+       __end_of_kernel_reserve = .;
+       . = ALIGN(PAGE_SIZE);
+-      .brk : AT(ADDR(.brk) - LOAD_OFFSET) {
++      .brk (NOLOAD) : AT(ADDR(.brk) - LOAD_OFFSET) {
+               __brk_base = .;
+               . += 64 * 1024;         /* 64k alignment slop space */
+-              *(.brk_reservation)     /* areas brk users have reserved */
++              *(.bss..brk)            /* areas brk users have reserved */
+               __brk_limit = .;
+       }
diff --git a/queue-5.15/x86-mm-simplify-reserve_brk.patch b/queue-5.15/x86-mm-simplify-reserve_brk.patch
new file mode 100644 (file)
index 0000000..1324b28
--- /dev/null
@@ -0,0 +1,75 @@
+From 069f622c5d827be25cdf13e300fc4c4b0c97f997 Mon Sep 17 00:00:00 2001
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+Date: Fri, 6 May 2022 14:14:32 +0200
+Subject: x86/mm: Simplify RESERVE_BRK()
+
+From: Josh Poimboeuf <jpoimboe@redhat.com>
+
+commit a1e2c031ec3949b8c039b739c0b5bf9c30007b00 upstream.
+
+RESERVE_BRK() reserves data in the .brk_reservation section.  The data
+is initialized to zero, like BSS, so the macro specifies 'nobits' to
+prevent the data from taking up space in the vmlinux binary.  The only
+way to get the compiler to do that (without putting the variable in .bss
+proper) is to use inline asm.
+
+The macro also has a hack which encloses the inline asm in a discarded
+function, which allows the size to be passed (global inline asm doesn't
+allow inputs).
+
+Remove the need for the discarded function hack by just stringifying the
+size rather than supplying it as an input to the inline asm.
+
+Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Reviewed-by: Borislav Petkov <bp@suse.de>
+Link: https://lore.kernel.org/r/20220506121631.133110232@infradead.org
+[nathan: Resolve conflict due to lack of 2b6ff7dea670]
+Signed-off-by: Nathan Chancellor <nathan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/include/asm/setup.h |   30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+--- a/arch/x86/include/asm/setup.h
++++ b/arch/x86/include/asm/setup.h
+@@ -108,27 +108,19 @@ extern unsigned long _brk_end;
+ void *extend_brk(size_t size, size_t align);
+ /*
+- * Reserve space in the brk section.  The name must be unique within
+- * the file, and somewhat descriptive.  The size is in bytes.  Must be
+- * used at file scope.
++ * Reserve space in the brk section.  The name must be unique within the file,
++ * and somewhat descriptive.  The size is in bytes.
+  *
+- * (This uses a temp function to wrap the asm so we can pass it the
+- * size parameter; otherwise we wouldn't be able to.  We can't use a
+- * "section" attribute on a normal variable because it always ends up
+- * being @progbits, which ends up allocating space in the vmlinux
+- * executable.)
++ * The allocation is done using inline asm (rather than using a section
++ * attribute on a normal variable) in order to allow the use of @nobits, so
++ * that it doesn't take up any space in the vmlinux file.
+  */
+-#define RESERVE_BRK(name,sz)                                          \
+-      static void __section(".discard.text") __used notrace           \
+-      __brk_reservation_fn_##name##__(void) {                         \
+-              asm volatile (                                          \
+-                      ".pushsection .brk_reservation,\"aw\",@nobits;" \
+-                      ".brk." #name ":"                               \
+-                      " 1:.skip %c0;"                                 \
+-                      " .size .brk." #name ", . - 1b;"                \
+-                      " .popsection"                                  \
+-                      : : "i" (sz));                                  \
+-      }
++#define RESERVE_BRK(name, size)                                               \
++      asm(".pushsection .brk_reservation,\"aw\",@nobits\n\t"          \
++          ".brk." #name ":\n\t"                                       \
++          ".skip " __stringify(size) "\n\t"                           \
++          ".size .brk." #name ", " __stringify(size) "\n\t"           \
++          ".popsection\n\t")
+ extern void probe_roms(void);
+ #ifdef __i386__