compiler.h: Enforce that READ_ONCE_NOCHECK() access size is sizeof(long)
READ_ONCE_NOCHECK() unconditionally performs a sizeof(long)-sized access, so enforce that the size of the pointed-to object that we are loading from is the same size as 'long'. Reported-by: Marco Elver <elver@google.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
8d4beed7bb
commit
b16d8ecf4f
|
@ -254,9 +254,12 @@ unsigned long __read_once_word_nocheck(const void *addr)
|
||||||
*/
|
*/
|
||||||
#define READ_ONCE_NOCHECK(x) \
|
#define READ_ONCE_NOCHECK(x) \
|
||||||
({ \
|
({ \
|
||||||
unsigned long __x = __read_once_word_nocheck(&(x)); \
|
unsigned long __x; \
|
||||||
|
compiletime_assert(sizeof(x) == sizeof(__x), \
|
||||||
|
"Unsupported access size for READ_ONCE_NOCHECK()."); \
|
||||||
|
__x = __read_once_word_nocheck(&(x)); \
|
||||||
smp_read_barrier_depends(); \
|
smp_read_barrier_depends(); \
|
||||||
__x; \
|
(typeof(x))__x; \
|
||||||
})
|
})
|
||||||
|
|
||||||
static __no_kasan_or_inline
|
static __no_kasan_or_inline
|
||||||
|
|
Loading…
Reference in New Issue