summaryrefslogtreecommitdiff
path: root/kern/percpu.c
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2018-06-25 20:44:10 +0200
committerRichard Braun <rbraun@sceen.net>2018-06-25 20:44:10 +0200
commit6c541a2654040e37aaef6ee4380ec8057b122364 (patch)
treec8f801a003dc9b1e504cf168bf602bc5ca757e25 /kern/percpu.c
parent452852d887514c172a26981e4d1ab24785cf27c1 (diff)
kern/percpu: introduce per-CPU operations
Diffstat (limited to 'kern/percpu.c')
-rw-r--r--kern/percpu.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/kern/percpu.c b/kern/percpu.c
index 53861a30..f344bd70 100644
--- a/kern/percpu.c
+++ b/kern/percpu.c
@@ -26,6 +26,7 @@
#include <kern/macros.h>
#include <kern/panic.h>
#include <kern/percpu.h>
+#include <kern/slist.h>
#include <machine/cpu.h>
#include <vm/vm_kmem.h>
#include <vm/vm_page.h>
@@ -36,6 +37,14 @@ static void *percpu_area_content __initdata;
static size_t percpu_area_size __initdata;
static int percpu_skip_warning __initdata;
+static struct slist percpu_ops __initdata;
+
+static void __init
+percpu_op_run(const struct percpu_op *op)
+{
+ op->fn();
+}
+
static int __init
percpu_bootstrap(void)
{
@@ -51,6 +60,8 @@ percpu_setup(void)
struct vm_page *page;
unsigned int order;
+ slist_init(&percpu_ops);
+
percpu_area_size = &_percpu_end - &_percpu;
log_info("percpu: max_cpus: %u, section size: %zuk", CONFIG_MAX_CPUS,
percpu_area_size >> 10);
@@ -76,6 +87,15 @@ INIT_OP_DEFINE(percpu_setup,
INIT_OP_DEP(percpu_bootstrap, true),
INIT_OP_DEP(vm_page_setup, true));
+void __init
+percpu_register_op(struct percpu_op *op)
+{
+ slist_insert_tail(&percpu_ops, &op->node);
+
+ /* Run on BSP */
+ percpu_op_run(op);
+}
+
int __init
percpu_add(unsigned int cpu)
{
@@ -116,6 +136,16 @@ out:
return 0;
}
+void __init
+percpu_ap_setup(void)
+{
+ struct percpu_op *op;
+
+ slist_for_each_entry(&percpu_ops, op, node) {
+ percpu_op_run(op);
+ }
+}
+
static int __init
percpu_cleanup(void)
{