[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/5 gnumach] sched_prim.c: Split bound processor case into two
From: |
Damien Zammit |
Subject: |
[PATCH 1/5 gnumach] sched_prim.c: Split bound processor case into two |
Date: |
Wed, 16 Aug 2023 01:48:55 +0000 |
---
kern/sched_prim.c | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/kern/sched_prim.c b/kern/sched_prim.c
index be34e7dd..d69e4990 100644
--- a/kern/sched_prim.c
+++ b/kern/sched_prim.c
@@ -1325,12 +1325,33 @@ void thread_setrun(
}
else {
/*
- * Bound, can only run on bound processor. Have to lock
- * processor here because it may not be the current one.
+ * Bound, can only run on bound processor.
+ * Check two cases, bound is current or not.
*/
- if (processor->state == PROCESSOR_IDLE) {
+#if MACH_HOST
+ pset = processor->processor_set;
+#else
+ pset = &default_pset;
+#endif /* MACH_HOST */
+ if (processor == current_processor()) {
+ if (processor->state == PROCESSOR_IDLE) {
+ simple_lock(&pset->idle_lock);
+ if (processor->state == PROCESSOR_IDLE) {
+ queue_remove(&pset->idle_queue, processor,
+ processor_t, processor_queue);
+ pset->idle_count--;
+ processor->next_thread = th;
+ processor->state = PROCESSOR_DISPATCHING;
+ simple_unlock(&pset->idle_lock);
+ /* Interrupt self */
+ cause_ast_check(processor);
+ return;
+ }
+ simple_unlock(&pset->idle_lock);
+ }
+ }
+ else {
processor_lock(processor);
- pset = processor->processor_set;
simple_lock(&pset->idle_lock);
if (processor->state == PROCESSOR_IDLE) {
queue_remove(&pset->idle_queue, processor,
@@ -1340,8 +1361,7 @@ void thread_setrun(
processor->state = PROCESSOR_DISPATCHING;
simple_unlock(&pset->idle_lock);
processor_unlock(processor);
- if (processor != current_processor())
- cause_ast_check(processor);
+ cause_ast_check(processor);
return;
}
simple_unlock(&pset->idle_lock);
--
2.40.1