From 5e16bb647c11d97e4100ae8bdf714721195a3d66 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sun, 25 Jan 2026 22:10:04 +0100 Subject: [PATCH] Multiple process suspension queues --- kernel/proc/mutex.c | 64 +++++++++++++++++++++++++++------------------ kernel/proc/proc.h | 10 +++++-- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/kernel/proc/mutex.c b/kernel/proc/mutex.c index 324f935..189f33f 100644 --- a/kernel/proc/mutex.c +++ b/kernel/proc/mutex.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -9,23 +10,20 @@ #include #include -bool proc_create_resource_mutex (struct proc_mutex* mutex) { - memset (mutex, 0, sizeof (*mutex)); - - return true; -} - -void proc_cleanup_resource_mutex (struct proc* proc, struct proc_resource* resource) { - struct proc_mutex* mutex = &resource->u.mutex; - - /* proc_mutex_unlock (proc, mutex); */ -} - static void proc_mutex_suspend (struct proc* proc, struct proc_suspension_q* sq, spin_lock_t* resource_lock, spin_lock_ctx_t* ctxrl) { spin_lock_ctx_t ctxpr, ctxcpu, ctxsq; struct cpu* cpu = proc->cpu; + struct proc_sq_entry* sq_entry = malloc (sizeof (*sq_entry)); + if (!sq_entry) { + spin_unlock (resource_lock, ctxrl); + return; + } + + sq_entry->proc = proc; + sq_entry->sq = sq; + spin_lock (&cpu->lock, &ctxcpu); spin_lock (&proc->lock, &ctxpr); spin_lock (&sq->lock, &ctxsq); @@ -33,7 +31,10 @@ static void proc_mutex_suspend (struct proc* proc, struct proc_suspension_q* sq, spin_unlock (resource_lock, ctxrl); atomic_store (&proc->state, PROC_SUSPENDED); - proc->suspension_q = sq; + + list_append (sq->proc_list, &sq_entry->sq_link); + + list_append (proc->sq_entries, &sq_entry->proc_link); list_remove (cpu->proc_run_q, &proc->cpu_run_q_link); atomic_fetch_sub (&cpu->proc_run_q_count, 1); @@ -41,7 +42,6 @@ static void proc_mutex_suspend (struct proc* proc, struct proc_suspension_q* sq, if (cpu->proc_current == proc) cpu->proc_current = NULL; - list_append (sq->proc_list, &proc->suspension_link); proc->cpu = NULL; spin_unlock (&sq->lock, &ctxsq); @@ -51,34 +51,45 @@ static void proc_mutex_suspend (struct proc* proc, struct proc_suspension_q* sq, cpu_request_sched (cpu); } -static void proc_mutex_resume (struct proc* proc) { +static void proc_mutex_resume (struct proc* proc, struct proc_sq_entry* sq_entry) { spin_lock_ctx_t ctxsq, ctxpr, ctxcpu; struct cpu* cpu = cpu_find_lightest (); + struct proc_suspension_q* sq = sq_entry->sq; spin_lock (&cpu->lock, &ctxcpu); spin_lock (&proc->lock, &ctxpr); - - proc->cpu = cpu; - struct proc_suspension_q* sq = proc->suspension_q; - spin_lock (&sq->lock, &ctxsq); - list_remove (sq->proc_list, &proc->suspension_link); + list_remove (sq->proc_list, &sq_entry->sq_link); + list_remove (proc->sq_entries, &sq_entry->proc_link); - proc->suspension_q = NULL; - atomic_store (&proc->state, PROC_READY); + proc->cpu = cpu; + + if (proc->sq_entries == NULL) + atomic_store (&proc->state, PROC_READY); list_append (cpu->proc_run_q, &proc->cpu_run_q_link); atomic_fetch_add (&cpu->proc_run_q_count, 1); spin_unlock (&sq->lock, &ctxsq); - spin_unlock (&proc->lock, &ctxpr); spin_unlock (&cpu->lock, &ctxcpu); + free (sq_entry); + cpu_request_sched (cpu); } +bool proc_create_resource_mutex (struct proc_mutex* mutex) { + memset (mutex, 0, sizeof (*mutex)); + + return true; +} + +void proc_cleanup_resource_mutex (struct proc* proc, struct proc_resource* resource) { + struct proc_mutex* mutex = &resource->u.mutex; +} + void proc_mutex_lock (struct proc* proc, struct proc_mutex* mutex) { spin_lock_ctx_t ctxmt; @@ -108,18 +119,19 @@ bool proc_mutex_unlock (struct proc* proc, struct proc_mutex* mutex) { spin_lock (&mutex->suspension_q.lock, &ctxsq); - struct proc* resumed_proc = NULL; struct list_node_link* node = mutex->suspension_q.proc_list; if (node) { - resumed_proc = list_entry (node, struct proc, suspension_link); + struct proc_sq_entry* sq_entry = list_entry (node, struct proc_sq_entry, sq_link); + struct proc* resumed_proc = sq_entry->proc; + mutex->owner = resumed_proc; mutex->locked = true; spin_unlock (&mutex->suspension_q.lock, &ctxsq); spin_unlock (&mutex->resource->lock, &ctxmt); - proc_mutex_resume (resumed_proc); + proc_mutex_resume (resumed_proc, sq_entry); return true; } diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index 8843a9d..8b05327 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -42,12 +42,19 @@ struct proc_resources { rw_spin_lock_t lock; }; +struct proc_sq_entry { + struct list_node_link sq_link; + struct list_node_link proc_link; + struct proc* proc; + struct proc_suspension_q* sq; +}; + struct proc { int pid; struct rb_node_link proc_tree_link; struct list_node_link cpu_run_q_link; - struct list_node_link suspension_link; struct list_node_link reap_link; + struct list_node_link* sq_entries; struct list_node_link* mappings; /* pd.lock implicitly protects this field */ struct proc_platformdata pdata; @@ -56,7 +63,6 @@ struct proc { spin_lock_t lock; struct cpu* cpu; atomic_int state; - struct proc_suspension_q* suspension_q; struct proc_resources* resources; };