From c65e5f6dee0aa259058487e8f2902617b8d5ef5e Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Wed, 11 Jan 2012 16:33:17 -0800 Subject: [PATCH] --- yaml --- r: 288559 b: refs/heads/master c: 768dfffdffbfcc07d6927bdd642c714c0dd64c99 h: refs/heads/master i: 288557: e23dcf5233a9009a43008a1bcc6976bbe9467563 288555: 40e91c27a62e67bc3ee592e4ee051f577e4656f5 288551: a84900cbe3824567a32b280a45f71c6e124e1d43 288543: a48f994e674cb9f04ad792cc7bf1e47fbed87c7e v: v3 --- [refs] | 2 +- trunk/include/linux/rcutiny.h | 4 ---- trunk/kernel/rcutiny_plugin.h | 15 ++++++++++++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 793a83ac0c1a..9912994e0394 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: afef20540f7cd1ea91bc1ac20be238389eee4003 +refs/heads/master: 768dfffdffbfcc07d6927bdd642c714c0dd64c99 diff --git a/trunk/include/linux/rcutiny.h b/trunk/include/linux/rcutiny.h index 51bf29c81485..e93df77176d1 100644 --- a/trunk/include/linux/rcutiny.h +++ b/trunk/include/linux/rcutiny.h @@ -27,13 +27,9 @@ #include -#ifdef CONFIG_RCU_BOOST static inline void rcu_init(void) { } -#else /* #ifdef CONFIG_RCU_BOOST */ -void rcu_init(void); -#endif /* #else #ifdef CONFIG_RCU_BOOST */ static inline void rcu_barrier_bh(void) { diff --git a/trunk/kernel/rcutiny_plugin.h b/trunk/kernel/rcutiny_plugin.h index b58a3200f0ff..95df60ebe363 100644 --- a/trunk/kernel/rcutiny_plugin.h +++ b/trunk/kernel/rcutiny_plugin.h @@ -914,7 +914,8 @@ static void rcu_preempt_process_callbacks(void) static void invoke_rcu_callbacks(void) { have_rcu_kthread_work = 1; - wake_up(&rcu_kthread_wq); + if (rcu_kthread_task != NULL) + wake_up(&rcu_kthread_wq); } #ifdef CONFIG_RCU_TRACE @@ -975,12 +976,16 @@ early_initcall(rcu_spawn_kthreads); #else /* #ifdef CONFIG_RCU_BOOST */ +/* Hold off callback invocation until early_initcall() time. */ +static int rcu_scheduler_fully_active __read_mostly; + /* * Start up softirq processing of callbacks. */ void invoke_rcu_callbacks(void) { - raise_softirq(RCU_SOFTIRQ); + if (rcu_scheduler_fully_active) + raise_softirq(RCU_SOFTIRQ); } #ifdef CONFIG_RCU_TRACE @@ -995,10 +1000,14 @@ static bool rcu_is_callbacks_kthread(void) #endif /* #ifdef CONFIG_RCU_TRACE */ -void rcu_init(void) +static int __init rcu_scheduler_really_started(void) { + rcu_scheduler_fully_active = 1; open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); + raise_softirq(RCU_SOFTIRQ); /* Invoke any callbacks from early boot. */ + return 0; } +early_initcall(rcu_scheduler_really_started); #endif /* #else #ifdef CONFIG_RCU_BOOST */