From: Greg Kroah-Hartman Date: Mon, 14 Dec 2020 15:49:09 +0000 (+0100) Subject: 5.4-stable patches X-Git-Tag: v5.10.1~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=11463b7c45c04494c445d85a737138ea1ce2c055;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: compiler.h-fix-barrier_data-on-clang.patch --- diff --git a/queue-5.4/compiler.h-fix-barrier_data-on-clang.patch b/queue-5.4/compiler.h-fix-barrier_data-on-clang.patch new file mode 100644 index 00000000000..09d7ccd6cbe --- /dev/null +++ b/queue-5.4/compiler.h-fix-barrier_data-on-clang.patch @@ -0,0 +1,120 @@ +From foo@baz Mon Dec 14 04:48:16 PM CET 2020 +From: Arvind Sankar +Date: Fri, 13 Nov 2020 22:51:59 -0800 +Subject: compiler.h: fix barrier_data() on clang + +From: Arvind Sankar + +commit 3347acc6fcd4ee71ad18a9ff9d9dac176b517329 upstream. + +Commit 815f0ddb346c ("include/linux/compiler*.h: make compiler-*.h +mutually exclusive") neglected to copy barrier_data() from +compiler-gcc.h into compiler-clang.h. + +The definition in compiler-gcc.h was really to work around clang's more +aggressive optimization, so this broke barrier_data() on clang, and +consequently memzero_explicit() as well. + +For example, this results in at least the memzero_explicit() call in +lib/crypto/sha256.c:sha256_transform() being optimized away by clang. + +Fix this by moving the definition of barrier_data() into compiler.h. + +Also move the gcc/clang definition of barrier() into compiler.h, +__memory_barrier() is icc-specific (and barrier() is already defined +using it in compiler-intel.h) and doesn't belong in compiler.h. + +[rdunlap@infradead.org: fix ALPHA builds when SMP is not enabled] + +Link: https://lkml.kernel.org/r/20201101231835.4589-1-rdunlap@infradead.org +Fixes: 815f0ddb346c ("include/linux/compiler*.h: make compiler-*.h mutually exclusive") +Signed-off-by: Arvind Sankar +Signed-off-by: Randy Dunlap +Signed-off-by: Andrew Morton +Tested-by: Nick Desaulniers +Reviewed-by: Nick Desaulniers +Reviewed-by: Kees Cook +Cc: +Link: https://lkml.kernel.org/r/20201014212631.207844-1-nivedita@alum.mit.edu +Signed-off-by: Linus Torvalds +[nd: backport to account for missing + commit e506ea451254a ("compiler.h: Split {READ,WRITE}_ONCE definitions out into rwonce.h") + commit d08b9f0ca6605 ("scs: Add support for Clang's Shadow Call Stack (SCS)")] +Signed-off-by: Nick Desaulniers +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/compiler-clang.h | 6 ------ + include/linux/compiler-gcc.h | 19 ------------------- + include/linux/compiler.h | 18 ++++++++++++++++-- + 3 files changed, 16 insertions(+), 27 deletions(-) + +--- a/include/linux/compiler-clang.h ++++ b/include/linux/compiler-clang.h +@@ -36,9 +36,3 @@ + __has_builtin(__builtin_sub_overflow) + #define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 + #endif +- +-/* The following are for compatibility with GCC, from compiler-gcc.h, +- * and may be redefined here because they should not be shared with other +- * compilers, like ICC. +- */ +-#define barrier() __asm__ __volatile__("" : : : "memory") +--- a/include/linux/compiler-gcc.h ++++ b/include/linux/compiler-gcc.h +@@ -14,25 +14,6 @@ + # error Sorry, your compiler is too old - please upgrade it. + #endif + +-/* Optimization barrier */ +- +-/* The "volatile" is due to gcc bugs */ +-#define barrier() __asm__ __volatile__("": : :"memory") +-/* +- * This version is i.e. to prevent dead stores elimination on @ptr +- * where gcc and llvm may behave differently when otherwise using +- * normal barrier(): while gcc behavior gets along with a normal +- * barrier(), llvm needs an explicit input variable to be assumed +- * clobbered. The issue is as follows: while the inline asm might +- * access any memory it wants, the compiler could have fit all of +- * @ptr into memory registers instead, and since @ptr never escaped +- * from that, it proved that the inline asm wasn't touching any of +- * it. This version works well with both compilers, i.e. we're telling +- * the compiler that the inline asm absolutely may see the contents +- * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495 +- */ +-#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") +- + /* + * This macro obfuscates arithmetic on a variable address so that gcc + * shouldn't recognize the original var, and make assumptions about it. +--- a/include/linux/compiler.h ++++ b/include/linux/compiler.h +@@ -80,11 +80,25 @@ void ftrace_likely_update(struct ftrace_ + + /* Optimization barrier */ + #ifndef barrier +-# define barrier() __memory_barrier() ++/* The "volatile" is due to gcc bugs */ ++# define barrier() __asm__ __volatile__("": : :"memory") + #endif + + #ifndef barrier_data +-# define barrier_data(ptr) barrier() ++/* ++ * This version is i.e. to prevent dead stores elimination on @ptr ++ * where gcc and llvm may behave differently when otherwise using ++ * normal barrier(): while gcc behavior gets along with a normal ++ * barrier(), llvm needs an explicit input variable to be assumed ++ * clobbered. The issue is as follows: while the inline asm might ++ * access any memory it wants, the compiler could have fit all of ++ * @ptr into memory registers instead, and since @ptr never escaped ++ * from that, it proved that the inline asm wasn't touching any of ++ * it. This version works well with both compilers, i.e. we're telling ++ * the compiler that the inline asm absolutely may see the contents ++ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495 ++ */ ++# define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") + #endif + + /* workaround for GCC PR82365 if needed */ diff --git a/queue-5.4/series b/queue-5.4/series index b06671514ec..3d0f957f3aa 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -35,3 +35,4 @@ x86-apic-vector-fix-ordering-in-vector-assignment.patch dm-raid-fix-discard-limits-for-raid1-and-raid10.patch md-change-mddev-chunk_sectors-from-int-to-unsigned.patch mm-zsmalloc.c-drop-zsmalloc_pgtable_mapping.patch +compiler.h-fix-barrier_data-on-clang.patch