[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |