From: Greg Kroah-Hartman Date: Fri, 15 Jan 2021 09:46:50 +0000 (+0100) Subject: 4.4-stable patches X-Git-Tag: v4.4.252~24 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5ff24bab266e0f90a0caa61d581ddeba7db368ca;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: vmlinux.lds.h-add-pgo-and-autofdo-input-sections.patch --- diff --git a/queue-4.4/series b/queue-4.4/series index 2e293b86882..e545840797b 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -7,3 +7,4 @@ scsi-target-fix-xcopy-naa-identifier-lookup.patch powerpc-fix-incorrect-stw-ux-u-x-instructions-in-__s.patch net-ip-always-refragment-ip-defragmented-packets.patch net-fix-pmtu-check-in-nopmtudisc-mode.patch +vmlinux.lds.h-add-pgo-and-autofdo-input-sections.patch diff --git a/queue-4.4/vmlinux.lds.h-add-pgo-and-autofdo-input-sections.patch b/queue-4.4/vmlinux.lds.h-add-pgo-and-autofdo-input-sections.patch new file mode 100644 index 00000000000..0df86b41ee7 --- /dev/null +++ b/queue-4.4/vmlinux.lds.h-add-pgo-and-autofdo-input-sections.patch @@ -0,0 +1,87 @@ +From foo@baz Fri Jan 15 10:45:42 AM CET 2021 +From: Nick Desaulniers +Date: Fri, 21 Aug 2020 12:42:47 -0700 +Subject: vmlinux.lds.h: Add PGO and AutoFDO input sections + +From: Nick Desaulniers + +commit eff8728fe69880d3f7983bec3fb6cea4c306261f upstream. + +Basically, consider .text.{hot|unlikely|unknown}.* part of .text, too. + +When compiling with profiling information (collected via PGO +instrumentations or AutoFDO sampling), Clang will separate code into +.text.hot, .text.unlikely, or .text.unknown sections based on profiling +information. After D79600 (clang-11), these sections will have a +trailing `.` suffix, ie. .text.hot., .text.unlikely., .text.unknown.. + +When using -ffunction-sections together with profiling infomation, +either explicitly (FGKASLR) or implicitly (LTO), code may be placed in +sections following the convention: +.text.hot., .text.unlikely., .text.unknown. +where , , and are functions. (This produces one section +per function; we generally try to merge these all back via linker script +so that we don't have 50k sections). + +For the above cases, we need to teach our linker scripts that such +sections might exist and that we'd explicitly like them grouped +together, otherwise we can wind up with code outside of the +_stext/_etext boundaries that might not be mapped properly for some +architectures, resulting in boot failures. + +If the linker script is not told about possible input sections, then +where the section is placed as output is a heuristic-laiden mess that's +non-portable between linkers (ie. BFD and LLD), and has resulted in many +hard to debug bugs. Kees Cook is working on cleaning this up by adding +--orphan-handling=warn linker flag used in ARCH=powerpc to additional +architectures. In the case of linker scripts, borrowing from the Zen of +Python: explicit is better than implicit. + +Also, ld.bfd's internal linker script considers .text.hot AND +.text.hot.* to be part of .text, as well as .text.unlikely and +.text.unlikely.*. I didn't see support for .text.unknown.*, and didn't +see Clang producing such code in our kernel builds, but I see code in +LLVM that can produce such section names if profiling information is +missing. That may point to a larger issue with generating or collecting +profiles, but I would much rather be safe and explicit than have to +debug yet another issue related to orphan section placement. + +Reported-by: Jian Cai +Suggested-by: Fāng-ruì Sòng +Signed-off-by: Nick Desaulniers +Signed-off-by: Kees Cook +Signed-off-by: Ingo Molnar +Tested-by: Luis Lozano +Tested-by: Manoj Gupta +Acked-by: Kees Cook +Cc: linux-arch@vger.kernel.org +Cc: stable@vger.kernel.org +Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=add44f8d5c5c05e08b11e033127a744d61c26aee +Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=1de778ed23ce7492c523d5850c6c6dbb34152655 +Link: https://reviews.llvm.org/D79600 +Link: https://bugs.chromium.org/p/chromium/issues/detail?id=1084760 +Link: https://lore.kernel.org/r/20200821194310.3089815-7-keescook@chromium.org + +Debugged-by: Luis Lozano +[nc: Fix conflicts around lack of TEXT_MAIN, NOINSTR_TEXT, and + .text..refcount] +Signed-off-by: Nathan Chancellor +Signed-off-by: Greg Kroah-Hartman +--- + include/asm-generic/vmlinux.lds.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/include/asm-generic/vmlinux.lds.h ++++ b/include/asm-generic/vmlinux.lds.h +@@ -422,7 +422,10 @@ + * during second ld run in second ld pass when generating System.map */ + #define TEXT_TEXT \ + ALIGN_FUNCTION(); \ +- *(.text.hot .text .text.fixup .text.unlikely) \ ++ *(.text.hot .text.hot.*) \ ++ *(.text .text.fixup) \ ++ *(.text.unlikely .text.unlikely.*) \ ++ *(.text.unknown .text.unknown.*) \ + *(.ref.text) \ + MEM_KEEP(init.text) \ + MEM_KEEP(exit.text) \