[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# 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 <samuel.thibault@xxxxxxxxxx>
---
 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
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.