diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2015-05-26 21:39:36 -0400 |
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2015-05-27 22:02:05 -0400 |
| commit | 0a04b0166929405cd833c1cc40f99e862b965ddc (patch) | |
| tree | c108e2aee50ce533cef248c755e86d48c59a4ebf /include/linux/compiler.h | |
| parent | 6695b92a60bc7160c92d6dc5b17cc79673017c2f (diff) | |
rcu: Move lockless_dereference() out of rcupdate.h
I want to use lockless_dereference() from seqlock.h, which would mean
including rcupdate.h from it, however rcupdate.h already includes
seqlock.h.
Avoid this by moving lockless_dereference() into compiler.h. This is
somewhat tricky since it uses smp_read_barrier_depends() which isn't
available there, but its a CPP macro so we can get away with it.
The alternative would be moving it into asm/barrier.h, but that would
be updating each arch (I can do if people feel that is more
appropriate).
Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'include/linux/compiler.h')
| -rw-r--r-- | include/linux/compiler.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 867722591be2..eae42c21d5fd 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -457,6 +457,21 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
| 457 | (volatile typeof(x) *)&(x); }) | 457 | (volatile typeof(x) *)&(x); }) |
| 458 | #define ACCESS_ONCE(x) (*__ACCESS_ONCE(x)) | 458 | #define ACCESS_ONCE(x) (*__ACCESS_ONCE(x)) |
| 459 | 459 | ||
| 460 | /** | ||
| 461 | * lockless_dereference() - safely load a pointer for later dereference | ||
| 462 | * @p: The pointer to load | ||
| 463 | * | ||
| 464 | * Similar to rcu_dereference(), but for situations where the pointed-to | ||
| 465 | * object's lifetime is managed by something other than RCU. That | ||
| 466 | * "something other" might be reference counting or simple immortality. | ||
| 467 | */ | ||
| 468 | #define lockless_dereference(p) \ | ||
| 469 | ({ \ | ||
| 470 | typeof(p) _________p1 = ACCESS_ONCE(p); \ | ||
| 471 | smp_read_barrier_depends(); /* Dependency order vs. p above. */ \ | ||
| 472 | (_________p1); \ | ||
| 473 | }) | ||
| 474 | |||
| 460 | /* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */ | 475 | /* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */ |
| 461 | #ifdef CONFIG_KPROBES | 476 | #ifdef CONFIG_KPROBES |
| 462 | # define __kprobes __attribute__((__section__(".kprobes.text"))) | 477 | # define __kprobes __attribute__((__section__(".kprobes.text"))) |
