|
|
|
|
|
|
|
|
|
|
xen-changelog
[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
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] [xen-unstable] [Mini-OS] Fix domain blocking race,
Xen patchbot-unstable <=
|
|
|
|
|