| From | Will Deacon <> | Subject | [PATCH v5 16/18] kcsan: Rework data_race() so that it can be used by READ_ONCE() | Date | Mon, 11 May 2020 21:41:48 +0100 |
| |
Rework the data_race() macro so that it:
- Accepts expressions which evaluate to a 'const' type - Attempts to discard volatile qualifiers from scalar types, avoiding pointless stack spills - Uses __kcsan_{disable,enable}_current(), allowing its use from code that is built independently from the kernel, such as the vDSO
This will allow for its use by {READ,WRITE}_ONCE() in a subsequent patch. At the same time, fix-up some weird whitespace issues.
Cc: Marco Elver <elver@google.com> Signed-off-by: Will Deacon <will@kernel.org> --- include/linux/compiler.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 0caced170a8a..f2a64195ee8e 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -314,14 +314,15 @@ unsigned long read_word_at_a_time(const void *addr) * This macro *does not* affect normal code generation, but is a hint * to tooling that data races here are to be ignored. */ -#define data_race(expr) \ - ({ \ - typeof(({ expr; })) __val; \ - kcsan_disable_current(); \ - __val = ({ expr; }); \ - kcsan_enable_current(); \ - __val; \ - }) +#define data_race(expr) \ +({ \ + __kcsan_disable_current(); \ + ({ \ + __unqual_scalar_typeof(({ expr; })) __v = ({ expr; }); \ + __kcsan_enable_current(); \ + __v; \ + }); \ +}) #else #endif /* __KERNEL__ */ -- 2.26.2.645.ge9eca65c58-goog
|