Xen 
 
Home About Xen.org Xen Xen Summit Wiki Mailing List Bug Tracker Xen Downloads
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [Mini-OS] Make sure schedule() is called

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [Mini-OS] Make sure schedule() is called safely
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 24 Nov 2007 19:00:14 -0800
Delivery-date: Sat, 24 Nov 2007 19:00:56 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1195910960 0
# Node ID ee519207734fcd9874647268f756a6c503963782
# Parent  7eea09b188395a8e2d893bae4d5dab9b29f3ad71
[Mini-OS] Make sure schedule() is called safely

If a thread tries to sleep from a callback or with callbacks disabled,
Mini-OS will completely lock, so make sure this never happens.

Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxx>
---
 extras/mini-os/hypervisor.c         |    5 +++++
 extras/mini-os/include/hypervisor.h |    2 ++
 extras/mini-os/sched.c              |    8 ++++++++
 3 files changed, 15 insertions(+)

diff -r 7eea09b18839 -r ee519207734f extras/mini-os/hypervisor.c
--- a/extras/mini-os/hypervisor.c       Sat Nov 24 13:28:54 2007 +0000
+++ b/extras/mini-os/hypervisor.c       Sat Nov 24 13:29:20 2007 +0000
@@ -33,6 +33,8 @@
     ((sh)->evtchn_pending[idx] &                \
      ~(sh)->evtchn_mask[idx])
 
+int in_callback;
+
 void do_hypervisor_callback(struct pt_regs *regs)
 {
     unsigned long  l1, l2, l1i, l2i;
@@ -41,6 +43,7 @@ void do_hypervisor_callback(struct pt_re
     shared_info_t *s = HYPERVISOR_shared_info;
     vcpu_info_t   *vcpu_info = &s->vcpu_info[cpu];
 
+    in_callback = 1;
    
     vcpu_info->evtchn_upcall_pending = 0;
     /* NB. No need for a barrier here -- XCHG is a barrier on x86. */
@@ -59,6 +62,8 @@ void do_hypervisor_callback(struct pt_re
                        do_event(port, regs);
         }
     }
+
+    in_callback = 0;
 }
 
 
diff -r 7eea09b18839 -r ee519207734f extras/mini-os/include/hypervisor.h
--- a/extras/mini-os/include/hypervisor.h       Sat Nov 24 13:28:54 2007 +0000
+++ b/extras/mini-os/include/hypervisor.h       Sat Nov 24 13:29:20 2007 +0000
@@ -42,4 +42,6 @@ void unmask_evtchn(u32 port);
 void unmask_evtchn(u32 port);
 void clear_evtchn(u32 port);
 
+extern int in_callback;
+
 #endif /* __HYPERVISOR_H__ */
diff -r 7eea09b18839 -r ee519207734f extras/mini-os/sched.c
--- a/extras/mini-os/sched.c    Sat Nov 24 13:28:54 2007 +0000
+++ b/extras/mini-os/sched.c    Sat Nov 24 13:29:20 2007 +0000
@@ -125,6 +125,14 @@ void schedule(void)
     unsigned long flags;
     prev = current;
     local_irq_save(flags); 
+    if (in_callback) {
+        printk("Must not call schedule() from a callback\n");
+        BUG();
+    }
+    if (flags) {
+        printk("Must not call schedule() with IRQs disabled\n");
+        BUG();
+    }
     list_for_each(iterator, &exited_threads)
     {
         thread = list_entry(iterator, struct thread, thread_list);

_______________________________________________
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] Make sure schedule() is called safely, Xen patchbot-unstable <=