diff options
Diffstat (limited to 'include/linux/compiler.h')
-rw-r--r-- | include/linux/compiler.h | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 52e611ab9a6c..c2cc57a2f508 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -185,23 +185,21 @@ void __read_once_size(const volatile void *p, void *res, int size) | |||
185 | 185 | ||
186 | #ifdef CONFIG_KASAN | 186 | #ifdef CONFIG_KASAN |
187 | /* | 187 | /* |
188 | * This function is not 'inline' because __no_sanitize_address confilcts | 188 | * We can't declare function 'inline' because __no_sanitize_address confilcts |
189 | * with inlining. Attempt to inline it may cause a build failure. | 189 | * with inlining. Attempt to inline it may cause a build failure. |
190 | * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 | 190 | * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 |
191 | * '__maybe_unused' allows us to avoid defined-but-not-used warnings. | 191 | * '__maybe_unused' allows us to avoid defined-but-not-used warnings. |
192 | */ | 192 | */ |
193 | static __no_sanitize_address __maybe_unused | 193 | # define __no_kasan_or_inline __no_sanitize_address __maybe_unused |
194 | void __read_once_size_nocheck(const volatile void *p, void *res, int size) | ||
195 | { | ||
196 | __READ_ONCE_SIZE; | ||
197 | } | ||
198 | #else | 194 | #else |
199 | static __always_inline | 195 | # define __no_kasan_or_inline __always_inline |
196 | #endif | ||
197 | |||
198 | static __no_kasan_or_inline | ||
200 | void __read_once_size_nocheck(const volatile void *p, void *res, int size) | 199 | void __read_once_size_nocheck(const volatile void *p, void *res, int size) |
201 | { | 200 | { |
202 | __READ_ONCE_SIZE; | 201 | __READ_ONCE_SIZE; |
203 | } | 202 | } |
204 | #endif | ||
205 | 203 | ||
206 | static __always_inline void __write_once_size(volatile void *p, void *res, int size) | 204 | static __always_inline void __write_once_size(volatile void *p, void *res, int size) |
207 | { | 205 | { |
@@ -240,6 +238,7 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
240 | * required ordering. | 238 | * required ordering. |
241 | */ | 239 | */ |
242 | #include <asm/barrier.h> | 240 | #include <asm/barrier.h> |
241 | #include <linux/kasan-checks.h> | ||
243 | 242 | ||
244 | #define __READ_ONCE(x, check) \ | 243 | #define __READ_ONCE(x, check) \ |
245 | ({ \ | 244 | ({ \ |
@@ -259,6 +258,13 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
259 | */ | 258 | */ |
260 | #define READ_ONCE_NOCHECK(x) __READ_ONCE(x, 0) | 259 | #define READ_ONCE_NOCHECK(x) __READ_ONCE(x, 0) |
261 | 260 | ||
261 | static __no_kasan_or_inline | ||
262 | unsigned long read_word_at_a_time(const void *addr) | ||
263 | { | ||
264 | kasan_check_read(addr, 1); | ||
265 | return *(unsigned long *)addr; | ||
266 | } | ||
267 | |||
262 | #define WRITE_ONCE(x, val) \ | 268 | #define WRITE_ONCE(x, val) \ |
263 | ({ \ | 269 | ({ \ |
264 | union { typeof(x) __val; char __c[1]; } __u = \ | 270 | union { typeof(x) __val; char __c[1]; } __u = \ |