1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef LINUX_COMPILER_H
3 #define LINUX_COMPILER_H
4 
5 #include "../../../include/linux/compiler_types.h"
6 
7 #define WRITE_ONCE(var, val) \
8 	(*((volatile typeof(val) *)(&(var))) = (val))
9 
10 #define READ_ONCE(var) (*((volatile typeof(var) *)(&(var))))
11 
12 #define __aligned(x) __attribute((__aligned__(x)))
13 
14 /**
15  * data_race - mark an expression as containing intentional data races
16  *
17  * This data_race() macro is useful for situations in which data races
18  * should be forgiven.  One example is diagnostic code that accesses
19  * shared variables but is not a part of the core synchronization design.
20  * For example, if accesses to a given variable are protected by a lock,
21  * except for diagnostic code, then the accesses under the lock should
22  * be plain C-language accesses and those in the diagnostic code should
23  * use data_race().  This way, KCSAN will complain if buggy lockless
24  * accesses to that variable are introduced, even if the buggy accesses
25  * are protected by READ_ONCE() or WRITE_ONCE().
26  *
27  * This macro *does not* affect normal code generation, but is a hint
28  * to tooling that data races here are to be ignored.  If the access must
29  * be atomic *and* KCSAN should ignore the access, use both data_race()
30  * and READ_ONCE(), for example, data_race(READ_ONCE(x)).
31  */
32 #define data_race(expr)							\
33 ({									\
34 	__auto_type __v = (expr);					\
35 	__v;								\
36 })
37 
38 #endif
39