[xen-unstable] [Mini-OS] Fix domain blocking race

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen-unstable] [Mini-OS] Fix domain blocking race

Xen patchbot-unstable
# HG changeset patch
# User Keir Fraser <[hidden email]>
# Date 1195911099 0
# Node ID 96409cebd74bebbc8572cafb6ab019bbb49bdd17
# Parent  2c52520f3284525741aedd55ab06a41cd2c784fd
[Mini-OS] Fix domain blocking race

A callback which wakes a thread may happen between the moment
schedule() gives hand to the idle thread and the latter blocks the
domain.  Idle hence needs to atomically check that no thread is
running and block, else awoken threads may have to wait up to 10
seconds.

Signed-off-by: Samuel Thibault <[hidden email]>
---
 extras/mini-os/sched.c |   29 +++++++++++++++++++++++------
 1 files changed, 23 insertions(+), 6 deletions(-)

diff -r 2c52520f3284 -r 96409cebd74b extras/mini-os/sched.c
--- a/extras/mini-os/sched.c Sat Nov 24 13:31:01 2007 +0000
+++ b/extras/mini-os/sched.c Sat Nov 24 13:31:39 2007 +0000
@@ -224,12 +224,29 @@ void idle_thread_fn(void *unused)
 void idle_thread_fn(void *unused)
 {
     s_time_t until;
-    for(;;)
-    {
-        schedule();
-        /* block until the next timeout expires, or for 10 secs, whichever comes first */
-        until = blocking_time();
-        block_domain(until);
+    unsigned long flags;
+    struct list_head *iterator;
+    struct thread *next, *thread;
+    for(;;)
+    {
+        schedule();
+        next = NULL;
+        local_irq_save(flags);
+        list_for_each(iterator, &idle_thread->thread_list)
+        {
+            thread = list_entry(iterator, struct thread, thread_list);
+            if(is_runnable(thread))
+            {
+                next = thread;
+                break;
+            }
+        }
+        if (!next) {
+            /* block until the next timeout expires, or for 10 secs, whichever comes first */
+            until = blocking_time();
+            block_domain(until);
+        }
+        local_irq_restore(flags);
         wake_expired();
     }
 }

_______________________________________________
Xen-changelog mailing list
[hidden email]
http://lists.xensource.com/xen-changelog