diff options
| author | Ingo Molnar <mingo@kernel.org> | 2012-09-27 02:09:38 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2012-09-27 02:09:38 -0400 |
| commit | fa34da708cbe1e2d9a2ee7fc68ea8fccbf095d12 (patch) | |
| tree | b20795decb064af75aae8f9f6af77806b1a4769a /include/linux | |
| parent | a9b86fab4b0a36fc4cd2712a07259c2c0e769742 (diff) | |
| parent | cb349ca95407cbc11424d5e9fc7c8e700709041b (diff) | |
Merge branch 'rcu/idle' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into core/rcu
Pull the RCU adaptive-idle feature from Paul E. McKenney:
"This series adds RCU APIs that allow non-idle tasks to
enter RCU idle mode and provides x86 code to make use of them, allowing
RCU to treat user-mode execution as an extended quiescent state when the
new RCU_USER_QS kernel configuration parameter is specified. Work is
in progress to port this to a few other architectures, but is not part
of this series."
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/rcupdate.h | 15 | ||||
| -rw-r--r-- | include/linux/sched.h | 8 |
2 files changed, 23 insertions, 0 deletions
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 0fbbd52e01f9..7c968e4f929e 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -191,6 +191,21 @@ extern void rcu_idle_enter(void); | |||
| 191 | extern void rcu_idle_exit(void); | 191 | extern void rcu_idle_exit(void); |
| 192 | extern void rcu_irq_enter(void); | 192 | extern void rcu_irq_enter(void); |
| 193 | extern void rcu_irq_exit(void); | 193 | extern void rcu_irq_exit(void); |
| 194 | |||
| 195 | #ifdef CONFIG_RCU_USER_QS | ||
| 196 | extern void rcu_user_enter(void); | ||
| 197 | extern void rcu_user_exit(void); | ||
| 198 | extern void rcu_user_enter_after_irq(void); | ||
| 199 | extern void rcu_user_exit_after_irq(void); | ||
| 200 | extern void rcu_user_hooks_switch(struct task_struct *prev, | ||
| 201 | struct task_struct *next); | ||
| 202 | #else | ||
| 203 | static inline void rcu_user_enter(void) { } | ||
| 204 | static inline void rcu_user_exit(void) { } | ||
| 205 | static inline void rcu_user_enter_after_irq(void) { } | ||
| 206 | static inline void rcu_user_exit_after_irq(void) { } | ||
| 207 | #endif /* CONFIG_RCU_USER_QS */ | ||
| 208 | |||
| 194 | extern void exit_rcu(void); | 209 | extern void exit_rcu(void); |
| 195 | 210 | ||
| 196 | /** | 211 | /** |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 23bddac4bad8..335720a1fc33 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1885,6 +1885,14 @@ static inline void rcu_copy_process(struct task_struct *p) | |||
| 1885 | 1885 | ||
| 1886 | #endif | 1886 | #endif |
| 1887 | 1887 | ||
| 1888 | static inline void rcu_switch(struct task_struct *prev, | ||
| 1889 | struct task_struct *next) | ||
| 1890 | { | ||
| 1891 | #ifdef CONFIG_RCU_USER_QS | ||
| 1892 | rcu_user_hooks_switch(prev, next); | ||
| 1893 | #endif | ||
| 1894 | } | ||
| 1895 | |||
| 1888 | static inline void tsk_restore_flags(struct task_struct *task, | 1896 | static inline void tsk_restore_flags(struct task_struct *task, |
| 1889 | unsigned long orig_flags, unsigned long flags) | 1897 | unsigned long orig_flags, unsigned long flags) |
| 1890 | { | 1898 | { |
