diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-14 16:36:04 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-14 16:36:04 -0400 |
| commit | 078838d56574694d0a4815d9c1b7f28e8844638b (patch) | |
| tree | 0d8c72d9dc46b0d2e72073fb928ec08e14b02b76 /include/linux | |
| parent | eeee78cf77df0450ca285a7cd6d73842181e825c (diff) | |
| parent | 590ee7dbd569a012df705a5204fc5f1066f52b8c (diff) | |
Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull RCU changes from Ingo Molnar:
"The main changes in this cycle were:
- changes permitting use of call_rcu() and friends very early in
boot, for example, before rcu_init() is invoked.
- add in-kernel API to enable and disable expediting of normal RCU
grace periods.
- improve RCU's handling of (hotplug-) outgoing CPUs.
- NO_HZ_FULL_SYSIDLE fixes.
- tiny-RCU updates to make it more tiny.
- documentation updates.
- miscellaneous fixes"
* 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (58 commits)
cpu: Provide smpboot_thread_init() on !CONFIG_SMP kernels as well
cpu: Defer smpboot kthread unparking until CPU known to scheduler
rcu: Associate quiescent-state reports with grace period
rcu: Yet another fix for preemption and CPU hotplug
rcu: Add diagnostics to grace-period cleanup
rcutorture: Default to grace-period-initialization delays
rcu: Handle outgoing CPUs on exit from idle loop
cpu: Make CPU-offline idle-loop transition point more precise
rcu: Eliminate ->onoff_mutex from rcu_node structure
rcu: Process offlining and onlining only at grace-period start
rcu: Move rcu_report_unblock_qs_rnp() to common code
rcu: Rework preemptible expedited bitmask handling
rcu: Remove event tracing from rcu_cpu_notify(), used by offline CPUs
rcutorture: Enable slow grace-period initializations
rcu: Provide diagnostic option to slow down grace-period initialization
rcu: Detect stalls caused by failure to propagate up rcu_node tree
rcu: Eliminate empty HOTPLUG_CPU ifdef
rcu: Simplify sync_rcu_preempt_exp_init()
rcu: Put all orphan-callback-related code under same comment
rcu: Consolidate offline-CPU callback initialization
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/cpu.h | 20 | ||||
| -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, 63 insertions, 6 deletions
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 4260e8594bd7..c0fb6b1b4712 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
| @@ -73,6 +73,7 @@ enum { | |||
| 73 | /* migration should happen before other stuff but after perf */ | 73 | /* migration should happen before other stuff but after perf */ |
| 74 | CPU_PRI_PERF = 20, | 74 | CPU_PRI_PERF = 20, |
| 75 | CPU_PRI_MIGRATION = 10, | 75 | CPU_PRI_MIGRATION = 10, |
| 76 | CPU_PRI_SMPBOOT = 9, | ||
| 76 | /* bring up workqueues before normal notifiers and down after */ | 77 | /* bring up workqueues before normal notifiers and down after */ |
| 77 | CPU_PRI_WORKQUEUE_UP = 5, | 78 | CPU_PRI_WORKQUEUE_UP = 5, |
| 78 | CPU_PRI_WORKQUEUE_DOWN = -5, | 79 | CPU_PRI_WORKQUEUE_DOWN = -5, |
| @@ -95,6 +96,10 @@ enum { | |||
| 95 | * Called on the new cpu, just before | 96 | * Called on the new cpu, just before |
| 96 | * enabling interrupts. Must not sleep, | 97 | * enabling interrupts. Must not sleep, |
| 97 | * must not fail */ | 98 | * must not fail */ |
| 99 | #define CPU_DYING_IDLE 0x000B /* CPU (unsigned)v dying, reached | ||
| 100 | * idle loop. */ | ||
| 101 | #define CPU_BROKEN 0x000C /* CPU (unsigned)v did not die properly, | ||
| 102 | * perhaps due to preemption. */ | ||
| 98 | 103 | ||
| 99 | /* Used for CPU hotplug events occurring while tasks are frozen due to a suspend | 104 | /* Used for CPU hotplug events occurring while tasks are frozen due to a suspend |
| 100 | * operation in progress | 105 | * operation in progress |
| @@ -161,6 +166,7 @@ static inline void __unregister_cpu_notifier(struct notifier_block *nb) | |||
| 161 | } | 166 | } |
| 162 | #endif | 167 | #endif |
| 163 | 168 | ||
| 169 | void smpboot_thread_init(void); | ||
| 164 | int cpu_up(unsigned int cpu); | 170 | int cpu_up(unsigned int cpu); |
| 165 | void notify_cpu_starting(unsigned int cpu); | 171 | void notify_cpu_starting(unsigned int cpu); |
| 166 | extern void cpu_maps_update_begin(void); | 172 | extern void cpu_maps_update_begin(void); |
| @@ -208,6 +214,10 @@ static inline void cpu_notifier_register_done(void) | |||
| 208 | { | 214 | { |
| 209 | } | 215 | } |
| 210 | 216 | ||
| 217 | static inline void smpboot_thread_init(void) | ||
| 218 | { | ||
| 219 | } | ||
| 220 | |||
| 211 | #endif /* CONFIG_SMP */ | 221 | #endif /* CONFIG_SMP */ |
| 212 | extern struct bus_type cpu_subsys; | 222 | extern struct bus_type cpu_subsys; |
| 213 | 223 | ||
| @@ -271,4 +281,14 @@ void arch_cpu_idle_enter(void); | |||
| 271 | void arch_cpu_idle_exit(void); | 281 | void arch_cpu_idle_exit(void); |
| 272 | void arch_cpu_idle_dead(void); | 282 | void arch_cpu_idle_dead(void); |
| 273 | 283 | ||
| 284 | DECLARE_PER_CPU(bool, cpu_dead_idle); | ||
| 285 | |||
| 286 | int cpu_report_state(int cpu); | ||
| 287 | int cpu_check_up_prepare(int cpu); | ||
| 288 | void cpu_set_state_online(int cpu); | ||
| 289 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 290 | bool cpu_wait_death(unsigned int cpu, int seconds); | ||
| 291 | bool cpu_report_death(void); | ||
| 292 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
| 293 | |||
| 274 | #endif /* _LINUX_CPU_H_ */ | 294 | #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. */ | ||
