]> xenbits.xensource.com Git - people/liuw/mini-os.git/commitdiff
mini-os: Notify shutdown through weak function call instead of wake queue
authorSamuel Thibault <samuel.thibaut@ens-lyon.org>
Wed, 9 Jan 2013 08:43:53 +0000 (08:43 +0000)
committerSamuel Thibault <samuel.thibaut@ens-lyon.org>
Wed, 9 Jan 2013 08:43:53 +0000 (08:43 +0000)
To allow for more flexibility, this notifies domain shutdown through a
function rather than a wake queue, to let the application use a wake
queue only if it wishes.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Committed-by: Keir Fraser <keir@xen.org>
include/kernel.h
kernel.c
test.c

index 78692e6c127a2d5e75422344cfb356dfff794572..b36f172ed80bb651d22438cbd2487d882ab9319d 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef _KERNEL_H_
 #define _KERNEL_H_
 
-extern unsigned int do_shutdown;
-extern unsigned int shutdown_reason;
-extern struct wait_queue_head shutdown_queue;
 extern void do_exit(void) __attribute__((noreturn));
 extern void stop_kernel(void);
 
index 0313ec8715c1ce146d8e0ea0d9770a71f88ddc39..e9402b911d2d94ca350c2171c78e602553d0a0b6 100644 (file)
--- a/kernel.c
+++ b/kernel.c
 
 uint8_t xen_features[XENFEAT_NR_SUBMAPS * 32];
 
-#ifdef CONFIG_XENBUS
-unsigned int do_shutdown = 0;
-unsigned int shutdown_reason;
-DECLARE_WAIT_QUEUE_HEAD(shutdown_queue);
-#endif
-
 void setup_xen_features(void)
 {
     xen_feature_info_t fi;
@@ -71,12 +65,19 @@ void setup_xen_features(void)
 }
 
 #ifdef CONFIG_XENBUS
+/* This should be overridden by the application we are linked against. */
+__attribute__((weak)) void app_shutdown(unsigned reason)
+{
+    printk("Shutdown requested: %d\n", reason);
+}
+
 static void shutdown_thread(void *p)
 {
     const char *path = "control/shutdown";
     const char *token = path;
     xenbus_event_queue events = NULL;
     char *shutdown, *err;
+    unsigned int shutdown_reason;
     xenbus_watch_path_token(XBT_NIL, path, token, &events);
     while ((err = xenbus_read(XBT_NIL, path, &shutdown)) != NULL)
     {
@@ -94,10 +95,7 @@ static void shutdown_thread(void *p)
     else
         /* Unknown */
         shutdown_reason = SHUTDOWN_crash;
-    wmb();
-    do_shutdown = 1;
-    wmb();
-    wake_up(&shutdown_queue);
+    app_shutdown(shutdown_reason);
 }
 #endif
 
diff --git a/test.c b/test.c
index 95e2d697f8b3423d5a602bdd40b2c7b223398145..0f348d2aacb60f908c01ea8b63f904a32f6e7935 100644 (file)
--- a/test.c
+++ b/test.c
 #include <xen/features.h>
 #include <xen/version.h>
 
+static unsigned int do_shutdown = 0;
+static unsigned int shutdown_reason;
+static DECLARE_WAIT_QUEUE_HEAD(shutdown_queue);
+
 static struct netfront_dev *net_dev;
 static struct semaphore net_sem = __SEMAPHORE_INITIALIZER(net_sem, 0);
 
@@ -487,6 +491,15 @@ void shutdown_frontends(void)
 #endif
 }
 
+void app_shutdown(unsigned reason)
+{
+    shutdown_reason = reason;
+    wmb();
+    do_shutdown = 1;
+    wmb();
+    wake_up(&shutdown_queue);
+}
+
 static void shutdown_thread(void *p)
 {
     DEFINE_WAIT(w);