WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] [Mini-OS] Make sure schedule() is called safely

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] [Mini-OS] Make sure schedule() is called safely
From: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
Date: Fri, 23 Nov 2007 17:28:47 +0000
Delivery-date: Fri, 23 Nov 2007 09:30:01 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Mail-followup-to: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.12-2006-07-14
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>

diff -r dc9246357cdb extras/mini-os/hypervisor.c
--- a/extras/mini-os/hypervisor.c       Fri Nov 23 16:42:44 2007 +0000
+++ b/extras/mini-os/hypervisor.c       Fri Nov 23 17:25:50 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 dc9246357cdb extras/mini-os/include/hypervisor.h
--- a/extras/mini-os/include/hypervisor.h       Fri Nov 23 16:42:44 2007 +0000
+++ b/extras/mini-os/include/hypervisor.h       Fri Nov 23 17:25:50 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 dc9246357cdb extras/mini-os/sched.c
--- a/extras/mini-os/sched.c    Fri Nov 23 16:42:44 2007 +0000
+++ b/extras/mini-os/sched.c    Fri Nov 23 17:25:50 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-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] [Mini-OS] Make sure schedule() is called safely, Samuel Thibault <=