aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rcutree.h
diff options
context:
space:
mode:
authorPaul E. McKenney <paul.mckenney@linaro.org>2011-05-05 00:43:49 -0400
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2011-05-08 01:50:45 -0400
commit1217ed1ba5c67393293dfb0f03c353b118dadeb4 (patch)
treea765356c8418e134de85fd05d9fe6eda41de859c /kernel/rcutree.h
parent29ce831000081dd757d3116bf774aafffc4b6b20 (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.h5
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);
444static void __init __rcu_init_preempt(void); 444static void __init __rcu_init_preempt(void);
445static void rcu_needs_cpu_flush(void); 445static void rcu_needs_cpu_flush(void);
446static void __init rcu_init_boost_waitqueue(struct rcu_node *rnp); 446static void __init rcu_init_boost_waitqueue(struct rcu_node *rnp);
447static void rcu_initiate_boost(struct rcu_node *rnp); 447static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags);
448static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, 448static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp,
449 cpumask_var_t cm); 449 cpumask_var_t cm);
450static void rcu_preempt_boost_start_gp(struct rcu_node *rnp); 450static void rcu_preempt_boost_start_gp(struct rcu_node *rnp);
451static int __cpuinit rcu_spawn_one_boost_kthread(struct rcu_state *rsp, 451static 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
455static 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 */