Commit 44b97dcc authored by Marco Elver's avatar Marco Elver Committed by Thomas Gleixner

compiler.h: Remove data_race() and unnecessary checks from {READ,WRITE}_ONCE()

The volatile accesses no longer need to be wrapped in data_race()
because compilers that emit instrumentation distinguishing volatile
accesses are required for KCSAN.

Consequently, the explicit kcsan_check_atomic*() are no longer required
either since the compiler emits instrumentation distinguishing the
volatile accesses.

Finally, simplify __READ_ONCE_SCALAR() and remove __WRITE_ONCE_SCALAR().

 [ bp: Convert commit message to passive voice. ]
Signed-off-by: default avatarMarco Elver <elver@google.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarWill Deacon <will@kernel.org>
Link: https://lkml.kernel.org/r/20200521142047.169334-9-elver@google.com

parent 0bb9ab3a
...@@ -281,9 +281,7 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, ...@@ -281,9 +281,7 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
#define __READ_ONCE_SCALAR(x) \ #define __READ_ONCE_SCALAR(x) \
({ \ ({ \
typeof(x) *__xp = &(x); \ __unqual_scalar_typeof(x) __x = __READ_ONCE(x); \
__unqual_scalar_typeof(x) __x = data_race(__READ_ONCE(*__xp)); \
kcsan_check_atomic_read(__xp, sizeof(*__xp)); \
smp_read_barrier_depends(); \ smp_read_barrier_depends(); \
(typeof(x))__x; \ (typeof(x))__x; \
}) })
...@@ -299,17 +297,10 @@ do { \ ...@@ -299,17 +297,10 @@ do { \
*(volatile typeof(x) *)&(x) = (val); \ *(volatile typeof(x) *)&(x) = (val); \
} while (0) } while (0)
#define __WRITE_ONCE_SCALAR(x, val) \
do { \
typeof(x) *__xp = &(x); \
kcsan_check_atomic_write(__xp, sizeof(*__xp)); \
data_race(({ __WRITE_ONCE(*__xp, val); 0; })); \
} while (0)
#define WRITE_ONCE(x, val) \ #define WRITE_ONCE(x, val) \
do { \ do { \
compiletime_assert_rwonce_type(x); \ compiletime_assert_rwonce_type(x); \
__WRITE_ONCE_SCALAR(x, val); \ __WRITE_ONCE(x, val); \
} while (0) } while (0)
#ifdef CONFIG_KASAN #ifdef CONFIG_KASAN
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment