From 326118bf300cf096cee04cb0a64789151ef8e273 Mon Sep 17 00:00:00 2001 From: Richard Braun Date: Tue, 20 Feb 2018 22:57:21 +0100 Subject: Rework the initialization operations of some kernel modules In order to avoid workarounds that check whether a module is ready or not, break the initialization of some core modules into a bootstrap step for basic BSP initialization, and a setup step that completes initialization. Most users only need the bootstrap operation as a dependency, especially since scheduling isn't enabled yet. --- kern/rcu.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'kern/rcu.c') diff --git a/kern/rcu.c b/kern/rcu.c index 82c62df3..0f8bb6ff 100644 --- a/kern/rcu.c +++ b/kern/rcu.c @@ -750,11 +750,24 @@ rcu_wait(void) } static int __init -rcu_setup(void) +rcu_bootstrap(void) { rcu_data_init(&rcu_data); + rcu_cpu_data_init(cpu_local_ptr(rcu_cpu_data), 0); + return 0; +} + +INIT_OP_DEFINE(rcu_bootstrap, + INIT_OP_DEP(spinlock_setup, true), + INIT_OP_DEP(sref_bootstrap, true), + INIT_OP_DEP(syscnt_setup, true), + INIT_OP_DEP(thread_bootstrap, true), + INIT_OP_DEP(timer_bootstrap, true)); - for (size_t i = 0; i < cpu_count(); i++) { +static int __init +rcu_setup(void) +{ + for (size_t i = 1; i < cpu_count(); i++) { rcu_cpu_data_init(percpu_ptr(rcu_cpu_data, i), i); } @@ -762,11 +775,5 @@ rcu_setup(void) } INIT_OP_DEFINE(rcu_setup, - INIT_OP_DEP(clock_setup, true), INIT_OP_DEP(cpu_mp_probe, true), - INIT_OP_DEP(spinlock_setup, true), - INIT_OP_DEP(sref_setup, true), - INIT_OP_DEP(syscnt_setup, true), - INIT_OP_DEP(thread_bootstrap, true), - INIT_OP_DEP(timer_setup, true), - INIT_OP_DEP(work_setup, true)); + INIT_OP_DEP(rcu_bootstrap, true)); -- cgit v1.2.3