diff options
author | Ingo Molnar <mingo@kernel.org> | 2015-06-02 02:10:14 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-06-02 02:18:34 -0400 |
commit | 085c789783f5f95c253740d3d0a1659ec5ff32a8 (patch) | |
tree | fc36f833f64d044483fd9ccf2f575e9477898914 /include/linux/compiler.h | |
parent | c46a024ea5eb0165114dbbc8c82c29b7bcf66e71 (diff) | |
parent | 0868aa22167d93dd974c253d259c3e6fd47a16c8 (diff) |
Merge branch 'for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into core/rcu
Pull RCU changes from Paul E. McKenney:
- Initialization/Kconfig updates: hide most Kconfig options from unsuspecting users.
There's now a single high level configuration option:
*
* RCU Subsystem
*
Make expert-level adjustments to RCU configuration (RCU_EXPERT) [N/y/?] (NEW)
Which if answered in the negative, leaves us with a single interactive
configuration option:
Offload RCU callback processing from boot-selected CPUs (RCU_NOCB_CPU) [N/y/?] (NEW)
All the rest of the RCU options are configured automatically.
- Remove all uses of RCU-protected array indexes: replace the
rcu_[access|dereference]_index_check() APIs with READ_ONCE() and rcu_lockdep_assert().
- RCU CPU-hotplug cleanups.
- Updates to Tiny RCU: a race fix and further code shrinkage.
- RCU torture-testing updates: fixes, speedups, cleanups and
documentation updates.
- Miscellaneous fixes.
- Documentation updates.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux/compiler.h')
-rw-r--r-- | include/linux/compiler.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 867722591be2..5d66777914db 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -252,6 +252,22 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
252 | #define WRITE_ONCE(x, val) \ | 252 | #define WRITE_ONCE(x, val) \ |
253 | ({ typeof(x) __val = (val); __write_once_size(&(x), &__val, sizeof(__val)); __val; }) | 253 | ({ typeof(x) __val = (val); __write_once_size(&(x), &__val, sizeof(__val)); __val; }) |
254 | 254 | ||
255 | /** | ||
256 | * READ_ONCE_CTRL - Read a value heading a control dependency | ||
257 | * @x: The value to be read, heading the control dependency | ||
258 | * | ||
259 | * Control dependencies are tricky. See Documentation/memory-barriers.txt | ||
260 | * for important information on how to use them. Note that in many cases, | ||
261 | * use of smp_load_acquire() will be much simpler. Control dependencies | ||
262 | * should be avoided except on the hottest of hotpaths. | ||
263 | */ | ||
264 | #define READ_ONCE_CTRL(x) \ | ||
265 | ({ \ | ||
266 | typeof(x) __val = READ_ONCE(x); \ | ||
267 | smp_read_barrier_depends(); /* Enforce control dependency. */ \ | ||
268 | __val; \ | ||
269 | }) | ||
270 | |||
255 | #endif /* __KERNEL__ */ | 271 | #endif /* __KERNEL__ */ |
256 | 272 | ||
257 | #endif /* __ASSEMBLY__ */ | 273 | #endif /* __ASSEMBLY__ */ |