diff options
| author | Ingo Molnar <mingo@kernel.org> | 2015-03-27 05:04:06 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2015-03-27 05:04:06 -0400 |
| commit | 4bfe186dbe0a058680e4bfb0d673194f0ceaffd4 (patch) | |
| tree | 5e374857dcd979d50f51c7091505784cb053d078 /include/linux | |
| parent | 3c435c1e472ba344ee25f795f4807d4457e61f6c (diff) | |
| parent | 42528795ac1c8d7ba021797ec004904168956d64 (diff) | |
Merge branch 'for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into core/rcu
Pull RCU updates from Paul E. McKenney:
- Documentation updates.
- Changes permitting use of call_rcu() and friends very early in
boot, for example, before rcu_init() is invoked.
- Miscellaneous fixes.
- Add in-kernel API to enable and disable expediting of normal RCU
grace periods.
- Improve RCU's handling of (hotplug-) outgoing CPUs.
Note: ARM support is lagging a bit here, and these improved
diagnostics might generate (harmless) splats.
- NO_HZ_FULL_SYSIDLE fixes.
- Tiny RCU updates to make it more tiny.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/cpu.h | 14 | ||||
| -rw-r--r-- | include/linux/lockdep.h | 7 | ||||
| -rw-r--r-- | include/linux/rcupdate.h | 40 | ||||
| -rw-r--r-- | include/linux/srcu.h | 2 |
4 files changed, 57 insertions, 6 deletions
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 4260e8594bd7..d028721748d4 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
| @@ -95,6 +95,10 @@ enum { | |||
| 95 | * Called on the new cpu, just before | 95 | * Called on the new cpu, just before |
| 96 | * enabling interrupts. Must not sleep, | 96 | * enabling interrupts. Must not sleep, |
| 97 | * must not fail */ | 97 | * must not fail */ |
| 98 | #define CPU_DYING_IDLE 0x000B /* CPU (unsigned)v dying, reached | ||
| 99 | * idle loop. */ | ||
| 100 | #define CPU_BROKEN 0x000C /* CPU (unsigned)v did not die properly, | ||
| 101 | * perhaps due to preemption. */ | ||
| 98 | 102 | ||
| 99 | /* Used for CPU hotplug events occurring while tasks are frozen due to a suspend | 103 | /* Used for CPU hotplug events occurring while tasks are frozen due to a suspend |
| 100 | * operation in progress | 104 | * operation in progress |
| @@ -271,4 +275,14 @@ void arch_cpu_idle_enter(void); | |||
| 271 | void arch_cpu_idle_exit(void); | 275 | void arch_cpu_idle_exit(void); |
| 272 | void arch_cpu_idle_dead(void); | 276 | void arch_cpu_idle_dead(void); |
| 273 | 277 | ||
| 278 | DECLARE_PER_CPU(bool, cpu_dead_idle); | ||
| 279 | |||
| 280 | int cpu_report_state(int cpu); | ||
| 281 | int cpu_check_up_prepare(int cpu); | ||
| 282 | void cpu_set_state_online(int cpu); | ||
| 283 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 284 | bool cpu_wait_death(unsigned int cpu, int seconds); | ||
| 285 | bool cpu_report_death(void); | ||
| 286 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
| 287 | |||
| 274 | #endif /* _LINUX_CPU_H_ */ | 288 | #endif /* _LINUX_CPU_H_ */ |
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 74ab23176e9b..066ba4157541 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h | |||
| @@ -531,8 +531,13 @@ do { \ | |||
| 531 | # define might_lock_read(lock) do { } while (0) | 531 | # define might_lock_read(lock) do { } while (0) |
| 532 | #endif | 532 | #endif |
| 533 | 533 | ||
| 534 | #ifdef CONFIG_PROVE_RCU | 534 | #ifdef CONFIG_LOCKDEP |
| 535 | void lockdep_rcu_suspicious(const char *file, const int line, const char *s); | 535 | void lockdep_rcu_suspicious(const char *file, const int line, const char *s); |
| 536 | #else | ||
| 537 | static inline void | ||
| 538 | lockdep_rcu_suspicious(const char *file, const int line, const char *s) | ||
| 539 | { | ||
| 540 | } | ||
| 536 | #endif | 541 | #endif |
| 537 | 542 | ||
| 538 | #endif /* __LINUX_LOCKDEP_H */ | 543 | #endif /* __LINUX_LOCKDEP_H */ |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 78097491cd99..573a5afd5ed8 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -48,6 +48,26 @@ | |||
| 48 | 48 | ||
| 49 | extern int rcu_expedited; /* for sysctl */ | 49 | extern int rcu_expedited; /* for sysctl */ |
| 50 | 50 | ||
| 51 | #ifdef CONFIG_TINY_RCU | ||
| 52 | /* Tiny RCU doesn't expedite, as its purpose in life is instead to be tiny. */ | ||
| 53 | static inline bool rcu_gp_is_expedited(void) /* Internal RCU use. */ | ||
| 54 | { | ||
| 55 | return false; | ||
| 56 | } | ||
| 57 | |||
| 58 | static inline void rcu_expedite_gp(void) | ||
| 59 | { | ||
| 60 | } | ||
| 61 | |||
| 62 | static inline void rcu_unexpedite_gp(void) | ||
| 63 | { | ||
| 64 | } | ||
| 65 | #else /* #ifdef CONFIG_TINY_RCU */ | ||
| 66 | bool rcu_gp_is_expedited(void); /* Internal RCU use. */ | ||
| 67 | void rcu_expedite_gp(void); | ||
| 68 | void rcu_unexpedite_gp(void); | ||
| 69 | #endif /* #else #ifdef CONFIG_TINY_RCU */ | ||
| 70 | |||
| 51 | enum rcutorture_type { | 71 | enum rcutorture_type { |
| 52 | RCU_FLAVOR, | 72 | RCU_FLAVOR, |
| 53 | RCU_BH_FLAVOR, | 73 | RCU_BH_FLAVOR, |
| @@ -195,6 +215,15 @@ void call_rcu_sched(struct rcu_head *head, | |||
| 195 | 215 | ||
| 196 | void synchronize_sched(void); | 216 | void synchronize_sched(void); |
| 197 | 217 | ||
| 218 | /* | ||
| 219 | * Structure allowing asynchronous waiting on RCU. | ||
| 220 | */ | ||
| 221 | struct rcu_synchronize { | ||
| 222 | struct rcu_head head; | ||
| 223 | struct completion completion; | ||
| 224 | }; | ||
| 225 | void wakeme_after_rcu(struct rcu_head *head); | ||
| 226 | |||
| 198 | /** | 227 | /** |
| 199 | * call_rcu_tasks() - Queue an RCU for invocation task-based grace period | 228 | * call_rcu_tasks() - Queue an RCU for invocation task-based grace period |
| 200 | * @head: structure to be used for queueing the RCU updates. | 229 | * @head: structure to be used for queueing the RCU updates. |
| @@ -258,6 +287,7 @@ static inline int rcu_preempt_depth(void) | |||
| 258 | 287 | ||
| 259 | /* Internal to kernel */ | 288 | /* Internal to kernel */ |
| 260 | void rcu_init(void); | 289 | void rcu_init(void); |
| 290 | void rcu_end_inkernel_boot(void); | ||
| 261 | void rcu_sched_qs(void); | 291 | void rcu_sched_qs(void); |
| 262 | void rcu_bh_qs(void); | 292 | void rcu_bh_qs(void); |
| 263 | void rcu_check_callbacks(int user); | 293 | void rcu_check_callbacks(int user); |
| @@ -266,6 +296,8 @@ void rcu_idle_enter(void); | |||
| 266 | void rcu_idle_exit(void); | 296 | void rcu_idle_exit(void); |
| 267 | void rcu_irq_enter(void); | 297 | void rcu_irq_enter(void); |
| 268 | void rcu_irq_exit(void); | 298 | void rcu_irq_exit(void); |
| 299 | int rcu_cpu_notify(struct notifier_block *self, | ||
| 300 | unsigned long action, void *hcpu); | ||
| 269 | 301 | ||
| 270 | #ifdef CONFIG_RCU_STALL_COMMON | 302 | #ifdef CONFIG_RCU_STALL_COMMON |
| 271 | void rcu_sysrq_start(void); | 303 | void rcu_sysrq_start(void); |
| @@ -720,7 +752,7 @@ static inline void rcu_preempt_sleep_check(void) | |||
| 720 | * annotated as __rcu. | 752 | * annotated as __rcu. |
| 721 | */ | 753 | */ |
| 722 | #define rcu_dereference_check(p, c) \ | 754 | #define rcu_dereference_check(p, c) \ |
| 723 | __rcu_dereference_check((p), rcu_read_lock_held() || (c), __rcu) | 755 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu) |
| 724 | 756 | ||
| 725 | /** | 757 | /** |
| 726 | * rcu_dereference_bh_check() - rcu_dereference_bh with debug checking | 758 | * rcu_dereference_bh_check() - rcu_dereference_bh with debug checking |
| @@ -730,7 +762,7 @@ static inline void rcu_preempt_sleep_check(void) | |||
| 730 | * This is the RCU-bh counterpart to rcu_dereference_check(). | 762 | * This is the RCU-bh counterpart to rcu_dereference_check(). |
| 731 | */ | 763 | */ |
| 732 | #define rcu_dereference_bh_check(p, c) \ | 764 | #define rcu_dereference_bh_check(p, c) \ |
| 733 | __rcu_dereference_check((p), rcu_read_lock_bh_held() || (c), __rcu) | 765 | __rcu_dereference_check((p), (c) || rcu_read_lock_bh_held(), __rcu) |
| 734 | 766 | ||
| 735 | /** | 767 | /** |
| 736 | * rcu_dereference_sched_check() - rcu_dereference_sched with debug checking | 768 | * rcu_dereference_sched_check() - rcu_dereference_sched with debug checking |
| @@ -740,7 +772,7 @@ static inline void rcu_preempt_sleep_check(void) | |||
| 740 | * This is the RCU-sched counterpart to rcu_dereference_check(). | 772 | * This is the RCU-sched counterpart to rcu_dereference_check(). |
| 741 | */ | 773 | */ |
| 742 | #define rcu_dereference_sched_check(p, c) \ | 774 | #define rcu_dereference_sched_check(p, c) \ |
| 743 | __rcu_dereference_check((p), rcu_read_lock_sched_held() || (c), \ | 775 | __rcu_dereference_check((p), (c) || rcu_read_lock_sched_held(), \ |
| 744 | __rcu) | 776 | __rcu) |
| 745 | 777 | ||
| 746 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ | 778 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ |
| @@ -933,9 +965,9 @@ static inline void rcu_read_unlock(void) | |||
| 933 | { | 965 | { |
| 934 | rcu_lockdep_assert(rcu_is_watching(), | 966 | rcu_lockdep_assert(rcu_is_watching(), |
| 935 | "rcu_read_unlock() used illegally while idle"); | 967 | "rcu_read_unlock() used illegally while idle"); |
| 936 | rcu_lock_release(&rcu_lock_map); | ||
| 937 | __release(RCU); | 968 | __release(RCU); |
| 938 | __rcu_read_unlock(); | 969 | __rcu_read_unlock(); |
| 970 | rcu_lock_release(&rcu_lock_map); /* Keep acq info for rls diags. */ | ||
| 939 | } | 971 | } |
| 940 | 972 | ||
| 941 | /** | 973 | /** |
diff --git a/include/linux/srcu.h b/include/linux/srcu.h index 9cfd9623fb03..bdeb4567b71e 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h | |||
| @@ -182,7 +182,7 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp) | |||
| 182 | * lockdep_is_held() calls. | 182 | * lockdep_is_held() calls. |
| 183 | */ | 183 | */ |
| 184 | #define srcu_dereference_check(p, sp, c) \ | 184 | #define srcu_dereference_check(p, sp, c) \ |
| 185 | __rcu_dereference_check((p), srcu_read_lock_held(sp) || (c), __rcu) | 185 | __rcu_dereference_check((p), (c) || srcu_read_lock_held(sp), __rcu) |
| 186 | 186 | ||
| 187 | /** | 187 | /** |
| 188 | * srcu_dereference - fetch SRCU-protected pointer for later dereferencing | 188 | * srcu_dereference - fetch SRCU-protected pointer for later dereferencing |
