diff options
| -rw-r--r-- | include/linux/rcutiny.h | 4 | ||||
| -rw-r--r-- | kernel/rcutiny_plugin.h | 15 | 
2 files changed, 12 insertions, 7 deletions
diff --git a/include/linux/rcutiny.h b/include/linux/rcutiny.h index 51bf29c8148..e93df77176d 100644 --- a/include/linux/rcutiny.h +++ b/include/linux/rcutiny.h @@ -27,13 +27,9 @@  #include <linux/cache.h> -#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/kernel/rcutiny_plugin.h b/kernel/rcutiny_plugin.h index b58a3200f0f..95df60ebe36 100644 --- a/kernel/rcutiny_plugin.h +++ b/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 */  |