From e78bfb9984266dcb05e473d822d646a480fd7f0f Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Thu, 29 Jan 2026 01:52:18 +0100 Subject: [PATCH] Move suspension q code into proc/suspension_q.c --- kernel/proc/mutex.c | 82 ++------------------------------------ kernel/proc/proc.h | 7 ---- kernel/proc/suspension_q.c | 79 ++++++++++++++++++++++++++++++++++++ kernel/proc/suspension_q.h | 10 +++++ 4 files changed, 93 insertions(+), 85 deletions(-) diff --git a/kernel/proc/mutex.c b/kernel/proc/mutex.c index f7b896c..d99596e 100644 --- a/kernel/proc/mutex.c +++ b/kernel/proc/mutex.c @@ -5,86 +5,12 @@ #include #include #include +#include #include #include #include #include -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); - - spin_unlock (resource_lock, ctxrl); - - atomic_store (&proc->state, PROC_SUSPENDED); - - /* append to sq's list */ - list_append (sq->proc_list, &sq_entry->sq_link); - - /* append to proc's list */ - 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); - - if (cpu->proc_current == proc) - cpu->proc_current = NULL; - - proc->cpu = NULL; - - spin_unlock (&sq->lock, &ctxsq); - spin_unlock (&proc->lock, &ctxpr); - spin_unlock (&cpu->lock, &ctxcpu); - - cpu_request_sched (cpu); -} - -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); - spin_lock (&sq->lock, &ctxsq); - - /* remove from sq's list */ - list_remove (sq->proc_list, &sq_entry->sq_link); - - /* remove from proc's list */ - list_remove (proc->sq_entries, &sq_entry->proc_link); - - 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); -} - void proc_mutexes_cleanup (struct proc* proc) { spin_lock_ctx_t ctxpg, ctxrs; @@ -134,7 +60,7 @@ void proc_cleanup_resource_mutex (struct proc_resource* resource) { spin_unlock (&mutex->suspension_q.lock, &ctxsq); spin_unlock (&mutex->resource->lock, &ctxmt); - proc_mutex_resume (suspended_proc, sq_entry); + proc_sq_resume (suspended_proc, sq_entry); /* reacquire */ spin_lock (&mutex->resource->lock, &ctxmt); @@ -161,7 +87,7 @@ void proc_mutex_lock (struct proc* proc, struct proc_mutex* mutex) { return; } - proc_mutex_suspend (proc, &mutex->suspension_q, &mutex->resource->lock, &ctxmt); + proc_sq_suspend (proc, &mutex->suspension_q, &mutex->resource->lock, &ctxmt); } } @@ -189,7 +115,7 @@ bool proc_mutex_unlock (struct proc* proc, struct proc_mutex* mutex) { spin_unlock (&mutex->suspension_q.lock, &ctxsq); spin_unlock (&mutex->resource->lock, &ctxmt); - proc_mutex_resume (resumed_proc, sq_entry); + proc_sq_resume (resumed_proc, sq_entry); return true; } diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index 029f31a..bba14ad 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -27,13 +27,6 @@ struct cpu; -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; diff --git a/kernel/proc/suspension_q.c b/kernel/proc/suspension_q.c index 07fd3a4..aee909b 100644 --- a/kernel/proc/suspension_q.c +++ b/kernel/proc/suspension_q.c @@ -1,8 +1,87 @@ #include +#include #include #include +#include #include #include +#include +#include + +void proc_sq_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); + + spin_unlock (resource_lock, ctxrl); + + atomic_store (&proc->state, PROC_SUSPENDED); + + /* append to sq's list */ + list_append (sq->proc_list, &sq_entry->sq_link); + + /* append to proc's list */ + 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); + + if (cpu->proc_current == proc) + cpu->proc_current = NULL; + + proc->cpu = NULL; + + spin_unlock (&sq->lock, &ctxsq); + spin_unlock (&proc->lock, &ctxpr); + spin_unlock (&cpu->lock, &ctxcpu); + + cpu_request_sched (cpu); +} + +void proc_sq_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); + spin_lock (&sq->lock, &ctxsq); + + /* remove from sq's list */ + list_remove (sq->proc_list, &sq_entry->sq_link); + + /* remove from proc's list */ + list_remove (proc->sq_entries, &sq_entry->proc_link); + + 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); +} void proc_sqs_cleanup (struct proc* proc) { spin_lock_ctx_t ctxsq, ctxpr; diff --git a/kernel/proc/suspension_q.h b/kernel/proc/suspension_q.h index 5c97945..0accd79 100644 --- a/kernel/proc/suspension_q.h +++ b/kernel/proc/suspension_q.h @@ -11,6 +11,16 @@ struct proc_suspension_q { 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; +}; + void proc_sqs_cleanup (struct proc* proc); +void proc_sq_suspend (struct proc* proc, struct proc_suspension_q* sq, spin_lock_t* resource_lock, + spin_lock_ctx_t* ctxrl); +void proc_sq_resume (struct proc* proc, struct proc_sq_entry* sq_entry); #endif // _KERNEL_PROC_SUSPENTION_Q_H