From 61aaead7e2904a2756ed72a71e36eeeb21591733 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Wed, 17 Sep 2025 03:10:28 -0400 Subject: kern/amd64: cpu: Add process load balancing This commit introduces load balancing of processes between cores by using a scalable "CPU arbiter" which decides how to fetch the next core descriptor. Signed-off-by: Ian Moffett --- src/sys/os/os_sched.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/sys/os') diff --git a/src/sys/os/os_sched.c b/src/sys/os/os_sched.c index f1bcc8c..e7cc832 100644 --- a/src/sys/os/os_sched.c +++ b/src/sys/os/os_sched.c @@ -33,6 +33,7 @@ */ #include +#include #include #include #include @@ -40,6 +41,41 @@ #include #include +__cacheline_aligned +static struct core_arbiter arbiter = { + .rr_id = 0, + .type = CORE_ARBITER_RR +}; + +/* + * Schedule the next processor core + */ +struct pcore * +cpu_sched(void) +{ + struct pcore *retval; + + spinlock_acquire(&arbiter.lock); + switch (arbiter.type) { + case CORE_ARBITER_RR: + retval = cpu_get(arbiter.rr_id++); + + /* + * If we made it at the end, wrap to the beginning. + * XXX: Us getting entry 0 would make the next be 1. + */ + if (retval == NULL) { + arbiter.rr_id = 1; + retval = cpu_get(0); + } + + break; + } + + spinlock_release(&arbiter.lock); + return retval; +} + /* * Enqueue a process into a queue */ -- cgit v1.2.3