From: Greg Kroah-Hartman Date: Tue, 31 Oct 2023 12:54:26 +0000 (+0100) Subject: 4.14-stable patches X-Git-Tag: v6.1.61~19 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=52e348307de08f1a7441fd4a133bc48c646217ab;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: x86-mm-fix-reserve_brk-for-older-binutils.patch x86-mm-simplify-reserve_brk.patch --- diff --git a/queue-4.14/series b/queue-4.14/series index 44bc32c2408..5e09fb803e9 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -18,3 +18,5 @@ kobject-fix-slab-out-of-bounds-in-fill_kobj_path.patch f2fs-fix-to-do-sanity-check-on-inode-type-during-garbage-collection.patch nfsd-lock_rename-needs-both-directories-to-live-on-the-same-fs.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-4.14/x86-mm-fix-reserve_brk-for-older-binutils.patch b/queue-4.14/x86-mm-fix-reserve_brk-for-older-binutils.patch new file mode 100644 index 00000000000..88182b2e088 --- /dev/null +++ b/queue-4.14/x86-mm-fix-reserve_brk-for-older-binutils.patch @@ -0,0 +1,131 @@ +From 9be27be873349f37d7ecd5d4864aed00114d8911 Mon Sep 17 00:00:00 2001 +From: Josh Poimboeuf +Date: Thu, 9 Jun 2022 00:17:32 -0700 +Subject: x86/mm: Fix RESERVE_BRK() for older binutils + +From: Josh Poimboeuf + +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 +Reported-by: Byungchul Park +Signed-off-by: Josh Poimboeuf +Signed-off-by: Peter Zijlstra (Intel) +Tested-by: Joe Damato +Link: https://lore.kernel.org/r/22d07a44c80d8e8e1e82b9a806ddc8c6bbb2606e.1654759036.git.jpoimboe@kernel.org +[nathan: Fix conflict due to lack of 360db4ace311 and resolve silent + conflict with 360db4ace3117] +Signed-off-by: Nathan Chancellor +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/include/asm/setup.h | 38 +++++++++++++++++++++----------------- + arch/x86/kernel/vmlinux.lds.S | 4 ++-- + 2 files changed, 23 insertions(+), 19 deletions(-) + +--- a/arch/x86/include/asm/setup.h ++++ b/arch/x86/include/asm/setup.h +@@ -91,19 +91,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] + + /* Helper for reserving space for arrays of things */ + #define RESERVE_BRK_ARRAY(type, name, entries) \ +@@ -121,12 +118,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/vmlinux.lds.S ++++ b/arch/x86/kernel/vmlinux.lds.S +@@ -359,10 +359,10 @@ SECTIONS + } + + . = 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-4.14/x86-mm-simplify-reserve_brk.patch b/queue-4.14/x86-mm-simplify-reserve_brk.patch new file mode 100644 index 00000000000..d04146036d0 --- /dev/null +++ b/queue-4.14/x86-mm-simplify-reserve_brk.patch @@ -0,0 +1,75 @@ +From 3e84500d881d306f8ff3b00b14e916ca0cb55238 Mon Sep 17 00:00:00 2001 +From: Josh Poimboeuf +Date: Fri, 6 May 2022 14:14:32 +0200 +Subject: x86/mm: Simplify RESERVE_BRK() + +From: Josh Poimboeuf + +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 +Signed-off-by: Peter Zijlstra (Intel) +Signed-off-by: Borislav Petkov +Reviewed-by: Borislav Petkov +Link: https://lore.kernel.org/r/20220506121631.133110232@infradead.org +[nathan: Fix conflict due to lack of 2b6ff7dea670 and 33def8498fdd] +Signed-off-by: Nathan Chancellor +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -91,27 +91,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") + + /* Helper for reserving space for arrays of things */ + #define RESERVE_BRK_ARRAY(type, name, entries) \