summaryrefslogtreecommitdiff
path: root/src/sys/arch/amd64/os/os_proc.c
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-10-10 15:15:47 -0400
committerIan Moffett <ian@osmora.org>2025-10-10 15:15:47 -0400
commit50f78ebbe69c8d5e0573b4987d1e7dc21af9779c (patch)
treeae8689ebca4ace5c2b30a46053df450dbb746ab2 /src/sys/arch/amd64/os/os_proc.c
parent58d7188fbd9ff448479f4a5c9ddcdcfae446ad16 (diff)
kern/amd64: Attempt to dequeue on a cores first go
When a CPU core first starts up, it has no proceses to assign to itself. This commit ensures that the processor will right away start trying to find tasks to grab from its runqueue. Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/arch/amd64/os/os_proc.c')
-rw-r--r--src/sys/arch/amd64/os/os_proc.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/sys/arch/amd64/os/os_proc.c b/src/sys/arch/amd64/os/os_proc.c
index d944f41..b8e7c99 100644
--- a/src/sys/arch/amd64/os/os_proc.c
+++ b/src/sys/arch/amd64/os/os_proc.c
@@ -137,11 +137,24 @@ md_proc_init(struct proc *procp, int flags)
__dead void
md_proc_yield(void)
{
- /* Clear pending interrupts and oneshot */
+ struct proc *proc;
+ struct pcore *core = this_core();
+ int error;
+
lapic_eoi();
- lapic_timer_oneshot_us(9000);
+ /*
+ * Set the oneshot timer and check if there is
+ * any procs in our runqueues. If not, wait for
+ * it to fire again.
+ */
for (;;) {
+ lapic_timer_oneshot_us(9000);
+ error = sched_deq(&core->scq, &proc);
+ if (error == 0) {
+ core->curproc = proc;
+ md_proc_kick(proc);
+ }
__ASMV("sti; hlt");
}
}