summaryrefslogtreecommitdiff
path: root/kern/rcu.c
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2018-02-20 22:57:21 +0100
committerRichard Braun <rbraun@sceen.net>2018-02-20 22:57:21 +0100
commit326118bf300cf096cee04cb0a64789151ef8e273 (patch)
tree082660557b642253771c483b1d535e8d3f95eb75 /kern/rcu.c
parentda8eb9c244d27fd042adde6234ccec079681d7f4 (diff)
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.
Diffstat (limited to 'kern/rcu.c')
-rw-r--r--kern/rcu.c25
1 files changed, 16 insertions, 9 deletions
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));