diff options
author | Paul E. McKenney <paul.mckenney@linaro.org> | 2011-05-05 00:43:49 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2011-05-08 01:50:45 -0400 |
commit | 1217ed1ba5c67393293dfb0f03c353b118dadeb4 (patch) | |
tree | a765356c8418e134de85fd05d9fe6eda41de859c /kernel/rcutree.h | |
parent | 29ce831000081dd757d3116bf774aafffc4b6b20 (diff) |
rcu: permit rcu_read_unlock() to be called while holding runqueue locks
Avoid calling into the scheduler while holding core RCU locks. This
allows rcu_read_unlock() to be called while holding the runqueue locks,
but only as long as there was no chance of the RCU read-side critical
section having been preempted. (Otherwise, if RCU priority boosting
is enabled, rcu_read_unlock() might call into the scheduler in order to
unboost itself, which might allows self-deadlock on the runqueue locks
within the scheduler.)
Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/rcutree.h')
-rw-r--r-- | kernel/rcutree.h | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index a6a97171dac6..93d4a1c2e88b 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
@@ -444,15 +444,12 @@ static void rcu_preempt_send_cbs_to_online(void); | |||
444 | static void __init __rcu_init_preempt(void); | 444 | static void __init __rcu_init_preempt(void); |
445 | static void rcu_needs_cpu_flush(void); | 445 | static void rcu_needs_cpu_flush(void); |
446 | static void __init rcu_init_boost_waitqueue(struct rcu_node *rnp); | 446 | static void __init rcu_init_boost_waitqueue(struct rcu_node *rnp); |
447 | static void rcu_initiate_boost(struct rcu_node *rnp); | 447 | static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags); |
448 | static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, | 448 | static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, |
449 | cpumask_var_t cm); | 449 | cpumask_var_t cm); |
450 | static void rcu_preempt_boost_start_gp(struct rcu_node *rnp); | 450 | static void rcu_preempt_boost_start_gp(struct rcu_node *rnp); |
451 | static int __cpuinit rcu_spawn_one_boost_kthread(struct rcu_state *rsp, | 451 | static int __cpuinit rcu_spawn_one_boost_kthread(struct rcu_state *rsp, |
452 | struct rcu_node *rnp, | 452 | struct rcu_node *rnp, |
453 | int rnp_index); | 453 | int rnp_index); |
454 | #ifdef CONFIG_HOTPLUG_CPU | ||
455 | static void rcu_stop_boost_kthread(struct rcu_node *rnp); | ||
456 | #endif /* #ifdef CONFIG_HOTPLUG_CPU */ | ||
457 | 454 | ||
458 | #endif /* #ifndef RCU_TREE_NONCORE */ | 455 | #endif /* #ifndef RCU_TREE_NONCORE */ |