From 50a352cdac11dbaf33f212574d7d9e3c79b525a1 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Thu, 19 Mar 2026 00:14:06 +0100 Subject: [PATCH] Catch stream heisenbug, initialize scheduler IRQs before smp_init (), reduce stream max size --- kernel/amd64/bootmain.c | 3 +++ kernel/amd64/sched1.c | 4 ++-- kernel/proc/proc.c | 7 +------ kernel/proc/proc.h | 2 ++ kernel/proc/resource.c | 2 +- kernel/proc/stream.h | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/kernel/amd64/bootmain.c b/kernel/amd64/bootmain.c index 0159284..ab66e5b 100644 --- a/kernel/amd64/bootmain.c +++ b/kernel/amd64/bootmain.c @@ -78,6 +78,9 @@ void bootmain (void) { struct device* temp0 = device_find ("temp0"); vfs_create_volume (thiscpu->kproc, &rctx, "temp", FS_FAT16, temp0, true); + irq_attach (&proc_irq_sched, NULL, SCHED_PREEMPT_TIMER); + irq_attach (&proc_irq_sched, NULL, CPU_REQUEST_SCHED); + smp_init (); proc_init (); diff --git a/kernel/amd64/sched1.c b/kernel/amd64/sched1.c index a9ffb77..4c49371 100644 --- a/kernel/amd64/sched1.c +++ b/kernel/amd64/sched1.c @@ -12,8 +12,6 @@ #include void do_sched (struct proc* proc, spin_lock_t* cpu_lock, uint64_t lockflags) { - __asm__ volatile ("cli"); - uint64_t fp; spin_lock (&proc->lock, &fp); @@ -32,5 +30,7 @@ void do_sched (struct proc* proc, spin_lock_t* cpu_lock, uint64_t lockflags) { spin_unlock (&proc->lock, fp); spin_unlock (cpu_lock, lockflags); + __asm__ volatile ("cli"); + do_sched1 ((void*)®s, cr3); } diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 8563446..cca320e 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -329,7 +329,7 @@ void proc_wait_for (struct proc* proc, struct reschedule_ctx* rctx, struct proc* proc_sq_suspend (proc, &wait_proc->done_sq, NULL, 0, rctx); } -static void proc_irq_sched (void* arg, void* regs, bool user, struct reschedule_ctx* rctx) { +void proc_irq_sched (void* arg, void* regs, bool user, struct reschedule_ctx* rctx) { (void)arg, (void)regs, (void)rctx, (void)user; rctx_insert_cpu (rctx, thiscpu); @@ -338,11 +338,6 @@ static void proc_irq_sched (void* arg, void* regs, bool user, struct reschedule_ void proc_init (void) { uint64_t fc; -#if defined(__x86_64__) - irq_attach (&proc_irq_sched, NULL, SCHED_PREEMPT_TIMER); - irq_attach (&proc_irq_sched, NULL, CPU_REQUEST_SCHED); -#endif - struct reschedule_ctx rctx; memset (&rctx, 0, sizeof (rctx)); diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index d845c75..aac5fa5 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -75,6 +75,8 @@ void proc_pid_alloc_init (void); void proc_wait_for (struct proc* proc, struct reschedule_ctx* rctx, struct proc* wait_proc); +void proc_irq_sched (void* arg, void* regs, bool user, struct reschedule_ctx* rctx); + void proc_init (void); struct proc* kproc_create (void); diff --git a/kernel/proc/resource.c b/kernel/proc/resource.c index 80a423b..c55edb9 100644 --- a/kernel/proc/resource.c +++ b/kernel/proc/resource.c @@ -120,7 +120,7 @@ struct proc_resource* proc_create_resource_stream (struct procgroup* procgroup) resource->lock = SPIN_LOCK_INIT; resource->ops.cleanup = &proc_cleanup_resource_stream; - resource->u.mail.resource = resource; + resource->u.stream.resource = resource; resource->type = PR_STREAM; if (!ringbuffer_init (&resource->u.stream.ringbuffer, PROC_STREAM_MAX, 1)) { diff --git a/kernel/proc/stream.h b/kernel/proc/stream.h index eb0331d..b6cca8d 100644 --- a/kernel/proc/stream.h +++ b/kernel/proc/stream.h @@ -6,7 +6,7 @@ #include #include -#define PROC_STREAM_MAX (1024 * 1024) +#define PROC_STREAM_MAX (64 * 1024) struct proc; struct proc_resource;