diff options
Diffstat (limited to 'include/linux/compiler.h')
| -rw-r--r-- | include/linux/compiler.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 1bb954842725..668569844d37 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -527,13 +527,14 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
| 527 | * object's lifetime is managed by something other than RCU. That | 527 | * object's lifetime is managed by something other than RCU. That |
| 528 | * "something other" might be reference counting or simple immortality. | 528 | * "something other" might be reference counting or simple immortality. |
| 529 | * | 529 | * |
| 530 | * The seemingly unused void * variable is to validate @p is indeed a pointer | 530 | * The seemingly unused variable ___typecheck_p validates that @p is |
| 531 | * type. All pointer types silently cast to void *. | 531 | * indeed a pointer type by using a pointer to typeof(*p) as the type. |
| 532 | * Taking a pointer to typeof(*p) again is needed in case p is void *. | ||
| 532 | */ | 533 | */ |
| 533 | #define lockless_dereference(p) \ | 534 | #define lockless_dereference(p) \ |
| 534 | ({ \ | 535 | ({ \ |
| 535 | typeof(p) _________p1 = READ_ONCE(p); \ | 536 | typeof(p) _________p1 = READ_ONCE(p); \ |
| 536 | __maybe_unused const void * const _________p2 = _________p1; \ | 537 | typeof(*(p)) *___typecheck_p __maybe_unused; \ |
| 537 | smp_read_barrier_depends(); /* Dependency order vs. p above. */ \ | 538 | smp_read_barrier_depends(); /* Dependency order vs. p above. */ \ |
| 538 | (_________p1); \ | 539 | (_________p1); \ |
| 539 | }) | 540 | }) |
