bug-hurd
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]