Be clear about @ptr vs the variable that @ptr points to, and add some more details as to why the special barrier_data() macro is required.
Signed-off-by: Arvind Sankar <nived...@alum.mit.edu> --- include/linux/compiler.h | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 93035d7fee0d..d8cee7c8968d 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -86,17 +86,28 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, #ifndef barrier_data /* - * 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 + * This version is 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. + * + * Its primary use is in implementing memzero_explicit(), which is used for + * clearing temporary data that may contain secrets. + * + * The issue is as follows: while the inline asm might access any memory it + * wants, the compiler could have fit all of the variable that @ptr points to + * into registers instead, and if @ptr never escaped from the function, it + * proved that the inline asm wasn't touching any of it. gcc only eliminates + * dead stores if the variable was actually allocated in registers, but llvm + * reasons that the variable _could_ have been in registers, so the inline asm + * can't reliably access it anyway, and eliminates dead stores even if the + * variable is actually in memory. + * + * This version works well with both compilers, i.e. we're telling the compiler + * that the inline asm absolutely may see the contents of the variable pointed + * to by @ptr. + * + * See also: https://llvm.org/bugs/show_bug.cgi?id=15495#c5 */ # define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") #endif -- 2.26.2