diff options
| -rw-r--r-- | include/linux/srcu.h | 6 | ||||
| -rw-r--r-- | init/main.c | 2 | ||||
| -rw-r--r-- | kernel/rcu/rcu.h | 6 | ||||
| -rw-r--r-- | kernel/rcu/srcutree.c | 5 | ||||
| -rw-r--r-- | kernel/rcu/tiny.c | 1 | ||||
| -rw-r--r-- | kernel/rcu/tree.c | 1 | 
6 files changed, 13 insertions, 8 deletions
diff --git a/include/linux/srcu.h b/include/linux/srcu.h index a0895bbf71ce..e6011a9975af 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h @@ -64,6 +64,12 @@ unsigned long get_state_synchronize_srcu(struct srcu_struct *ssp);  unsigned long start_poll_synchronize_srcu(struct srcu_struct *ssp);  bool poll_state_synchronize_srcu(struct srcu_struct *ssp, unsigned long cookie); +#ifdef CONFIG_SRCU +void srcu_init(void); +#else /* #ifdef CONFIG_SRCU */ +static inline void srcu_init(void) { } +#endif /* #else #ifdef CONFIG_SRCU */ +  #ifdef CONFIG_DEBUG_LOCK_ALLOC  /** diff --git a/init/main.c b/init/main.c index eb01e121d2f1..7b6f49c4d388 100644 --- a/init/main.c +++ b/init/main.c @@ -42,6 +42,7 @@  #include <linux/profile.h>  #include <linux/kfence.h>  #include <linux/rcupdate.h> +#include <linux/srcu.h>  #include <linux/moduleparam.h>  #include <linux/kallsyms.h>  #include <linux/writeback.h> @@ -979,6 +980,7 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)  	tick_init();  	rcu_init_nohz();  	init_timers(); +	srcu_init();  	hrtimers_init();  	softirq_init();  	timekeeping_init(); diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h index bf0827d4b659..ca3f2af32bf8 100644 --- a/kernel/rcu/rcu.h +++ b/kernel/rcu/rcu.h @@ -422,12 +422,6 @@ do {									\  #endif /* #if defined(CONFIG_SRCU) || !defined(CONFIG_TINY_RCU) */ -#ifdef CONFIG_SRCU -void srcu_init(void); -#else /* #ifdef CONFIG_SRCU */ -static inline void srcu_init(void) { } -#endif /* #else #ifdef CONFIG_SRCU */ -  #ifdef CONFIG_TINY_RCU  /* Tiny RCU doesn't expedite, as its purpose in life is instead to be tiny. */  static inline bool rcu_gp_is_normal(void) { return true; } diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c index f4f0cbf7a02b..9ec35c158740 100644 --- a/kernel/rcu/srcutree.c +++ b/kernel/rcu/srcutree.c @@ -1384,6 +1384,11 @@ void __init srcu_init(void)  {  	struct srcu_struct *ssp; +	/* +	 * Once that is set, call_srcu() can follow the normal path and +	 * queue delayed work. This must follow RCU workqueues creation +	 * and timers initialization. +	 */  	srcu_init_done = true;  	while (!list_empty(&srcu_boot_list)) {  		ssp = list_first_entry(&srcu_boot_list, struct srcu_struct, diff --git a/kernel/rcu/tiny.c b/kernel/rcu/tiny.c index c8a029fbb114..340b3f8b090d 100644 --- a/kernel/rcu/tiny.c +++ b/kernel/rcu/tiny.c @@ -221,5 +221,4 @@ void __init rcu_init(void)  {  	open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);  	rcu_early_boot_tests(); -	srcu_init();  } diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 8e78b2430c16..c35b15229cff 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -4735,7 +4735,6 @@ void __init rcu_init(void)  	WARN_ON(!rcu_gp_wq);  	rcu_par_gp_wq = alloc_workqueue("rcu_par_gp", WQ_MEM_RECLAIM, 0);  	WARN_ON(!rcu_par_gp_wq); -	srcu_init();  	/* Fill in default value for rcutree.qovld boot parameter. */  	/* -After- the rcu_node ->lock fields are initialized! */  | 
