xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [minios] Add xenbus shutdown control support
@ 2012-11-28 21:57 Samuel Thibault
  2012-11-29 11:14 ` Ian Campbell
  0 siblings, 1 reply; 5+ messages in thread
From: Samuel Thibault @ 2012-11-28 21:57 UTC (permalink / raw)
  To: xen-devel, Keir Fraser

Add a thread watching the xenbus shutdown control path and notifies a
wait queue.

Add HYPERVISOR_shutdown convenient inline for minios shutdown.

Add proper shutdown to the minios test application.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

diff -r fdf241ea6ff4 extras/mini-os/include/kernel.h
--- a/extras/mini-os/include/kernel.h	Wed Nov 28 21:29:18 2012 +0100
+++ b/extras/mini-os/include/kernel.h	Wed Nov 28 22:53:42 2012 +0100
@@ -1,6 +1,9 @@
 #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);
 
diff -r fdf241ea6ff4 extras/mini-os/include/x86/x86_32/hypercall-x86_32.h
--- a/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h	Wed Nov 28 21:29:18 2012 +0100
+++ b/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h	Wed Nov 28 22:53:42 2012 +0100
@@ -172,6 +172,14 @@
 	return _hypercall2(int, sched_op, cmd, arg);
 }
 
+static inline int
+HYPERVISOR_shutdown(
+	unsigned int reason)
+{
+	struct sched_shutdown shutdown = { .reason = reason };
+	return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown);
+}
+
 static inline long
 HYPERVISOR_set_timer_op(
 	uint64_t timeout)
diff -r fdf241ea6ff4 extras/mini-os/include/x86/x86_64/hypercall-x86_64.h
--- a/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h	Wed Nov 28 21:29:18 2012 +0100
+++ b/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h	Wed Nov 28 22:53:42 2012 +0100
@@ -176,6 +176,14 @@
 	return _hypercall2(int, sched_op, cmd, arg);
 }
 
+static inline int
+HYPERVISOR_shutdown(
+	unsigned int reason)
+{
+	struct sched_shutdown shutdown = { .reason = reason };
+	return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown);
+}
+
 static inline long
 HYPERVISOR_set_timer_op(
 	uint64_t timeout)
diff -r fdf241ea6ff4 extras/mini-os/kernel.c
--- a/extras/mini-os/kernel.c	Wed Nov 28 21:29:18 2012 +0100
+++ b/extras/mini-os/kernel.c	Wed Nov 28 22:53:42 2012 +0100
@@ -48,6 +48,10 @@
 
 uint8_t xen_features[XENFEAT_NR_SUBMAPS * 32];
 
+unsigned int do_shutdown = 0;
+unsigned int shutdown_reason;
+DECLARE_WAIT_QUEUE_HEAD(shutdown_queue);
+
 void setup_xen_features(void)
 {
     xen_feature_info_t fi;
@@ -64,6 +68,36 @@
     }
 }
 
+static void shutdown_thread(void *p)
+{
+    const char *path = "control/shutdown";
+    const char *token = path;
+    xenbus_event_queue events = NULL;
+    char *shutdown, *err;
+    xenbus_watch_path_token(XBT_NIL, path, token, &events);
+    while ((err = xenbus_read(XBT_NIL, path, &shutdown)) != NULL)
+    {
+        free(err);
+        xenbus_wait_for_watch(&events);
+    }
+    xenbus_unwatch_path_token(XBT_NIL, path, token);
+    xenbus_write(XBT_NIL, path, "");
+    printk("Shutting down (%s)\n", shutdown);
+
+    if (!strcmp(shutdown, "poweroff"))
+        shutdown_reason = SHUTDOWN_poweroff;
+    else if (!strcmp(shutdown, "reboot"))
+        shutdown_reason = SHUTDOWN_reboot;
+    else
+        /* Unknown */
+        shutdown_reason = SHUTDOWN_crash;
+    wmb();
+    do_shutdown = 1;
+    wmb();
+    wake_up(&shutdown_queue);
+}
+
+
 /* This should be overridden by the application we are linked against. */
 __attribute__((weak)) int app_main(start_info_t *si)
 {
@@ -126,6 +160,8 @@
     /* Init XenBus */
     init_xenbus();
 
+    create_thread("shutdown", shutdown_thread, NULL);
+
     /* Call (possibly overridden) app_main() */
     app_main(&start_info);
 
diff -r fdf241ea6ff4 extras/mini-os/test.c
--- a/extras/mini-os/test.c	Wed Nov 28 21:29:18 2012 +0100
+++ b/extras/mini-os/test.c	Wed Nov 28 22:53:42 2012 +0100
@@ -46,6 +46,7 @@
 #include <xen/version.h>
 
 static struct netfront_dev *net_dev;
+static struct semaphore net_sem = __SEMAPHORE_INITIALIZER(net_sem, 0);
 
 void test_xenbus(void);
 
@@ -70,12 +71,14 @@
 static void netfront_thread(void *p)
 {
     net_dev = init_netfront(NULL, NULL, NULL, NULL);
+    up(&net_sem);
 }
 
 static struct blkfront_dev *blk_dev;
 static struct blkfront_info blk_info;
 static uint64_t blk_size_read;
 static uint64_t blk_size_write;
+static struct semaphore blk_sem = __SEMAPHORE_INITIALIZER(blk_sem, 0);;
 
 struct blk_req {
     struct blkfront_aiocb aiocb;
@@ -189,8 +192,10 @@
     time_t lasttime = 0;
 
     blk_dev = init_blkfront(NULL, &blk_info);
-    if (!blk_dev)
+    if (!blk_dev) {
+        up(&blk_sem);
         return;
+    }
 
     if (blk_info.info & VDISK_CDROM)
         printk("Block device is a CDROM\n");
@@ -210,7 +215,7 @@
         blk_read_sector(blk_info.sectors-1);
     }
 
-    while (1) {
+    while (!do_shutdown) {
         uint64_t sector = rand() % blk_info.sectors;
         struct timeval tv;
 #ifdef BLKTEST_WRITE
@@ -235,6 +240,7 @@
         }
 #endif
     }
+    up(&blk_sem);
 }
 
 #define WIDTH 800
@@ -293,7 +299,6 @@
     xfree(mfns);
     if (!fb_dev) {
         xfree(fb);
-        return;
     }
     up(&fbfront_sem);
 }
@@ -330,17 +335,21 @@
 }
 
 static struct kbdfront_dev *kbd_dev;
+static struct semaphore kbd_sem = __SEMAPHORE_INITIALIZER(kbd_sem, 0);
 static void kbdfront_thread(void *p)
 {
     DEFINE_WAIT(w);
     DEFINE_WAIT(w2);
+    DEFINE_WAIT(w3);
     int x = WIDTH / 2, y = HEIGHT / 2, z = 0;
 
     kbd_dev = init_kbdfront(NULL, 1);
-    if (!kbd_dev)
+    down(&fbfront_sem);
+    if (!kbd_dev) {
+        up(&kbd_sem);
         return;
+    }
 
-    down(&fbfront_sem);
     refresh_cursor(x, y);
     while (1) {
         union xenkbd_in_event kbdevent;
@@ -349,6 +358,11 @@
 
         add_waiter(w, kbdfront_queue);
         add_waiter(w2, fbfront_queue);
+        add_waiter(w3, shutdown_queue);
+
+        rmb();
+        if (do_shutdown)
+            break;
 
         while (kbdfront_receive(kbd_dev, &kbdevent, 1) != 0) {
             sleep = 0;
@@ -391,9 +405,11 @@
                         fbfront_update(fb_dev, x - 16, y - 16, 33, 33);
                     }
                 } else if (kbdevent.key.keycode == KEY_Q) {
-                    struct sched_shutdown sched_shutdown = { .reason = SHUTDOWN_poweroff };
-                    HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
-                    do_exit();
+                    shutdown_reason = SHUTDOWN_poweroff;
+                    wmb();
+                    do_shutdown = 1;
+                    wmb();
+                    wake_up(&shutdown_queue);
                 }
                 break;
             }
@@ -410,11 +426,16 @@
         }
         if (sleep)
             schedule();
+        remove_waiter(w3, shutdown_queue);
+        remove_waiter(w2, fbfront_queue);
+        remove_waiter(w, kbdfront_queue);
     }
+    up(&kbd_sem);
 }
 
 #ifdef CONFIG_PCIFRONT
 static struct pcifront_dev *pci_dev;
+static struct semaphore pci_sem = __SEMAPHORE_INITIALIZER(pci_sem, 0);
 
 static void print_pcidev(unsigned int domain, unsigned int bus, unsigned int slot, unsigned int fun)
 {
@@ -432,13 +453,60 @@
 {
     pcifront_watches(NULL);
     pci_dev = init_pcifront(NULL);
-    if (!pci_dev)
+    if (!pci_dev) {
+        up(&pci_sem);
         return;
+    }
     printk("PCI devices:\n");
     pcifront_scan(pci_dev, print_pcidev);
+    up(&pci_sem);
 }
 #endif
 
+void shutdown_frontends(void)
+{
+    down(&net_sem);
+    if (net_dev)
+        shutdown_netfront(net_dev);
+
+    down(&blk_sem);
+    if (blk_dev)
+        shutdown_blkfront(blk_dev);
+
+    if (fb_dev)
+        shutdown_fbfront(fb_dev);
+
+    down(&kbd_sem);
+    if (kbd_dev)
+        shutdown_kbdfront(kbd_dev);
+
+#ifdef CONFIG_PCIFRONT
+    down(&pci_sem);
+    if (pci_dev)
+        shutdown_pcifront(pci_dev);
+#endif
+}
+
+static void shutdown_thread(void *p)
+{
+    DEFINE_WAIT(w);
+
+    while (1) {
+        add_waiter(w, shutdown_queue);
+        rmb();
+        if (do_shutdown) {
+            rmb();
+            break;
+        }
+        schedule();
+        remove_waiter(w, shutdown_queue);
+    }
+
+    shutdown_frontends();
+
+    HYPERVISOR_shutdown(shutdown_reason);
+}
+
 int app_main(start_info_t *si)
 {
     printk("Test main: start_info=%p\n", si);
@@ -451,25 +519,6 @@
 #ifdef CONFIG_PCIFRONT
     create_thread("pcifront", pcifront_thread, si);
 #endif
+    create_thread("shutdown", shutdown_thread, si);
     return 0;
 }
-
-void shutdown_frontends(void)
-{
-    if (net_dev)
-        shutdown_netfront(net_dev);
-
-    if (blk_dev)
-        shutdown_blkfront(blk_dev);
-
-    if (fb_dev)
-        shutdown_fbfront(fb_dev);
-
-    if (kbd_dev)
-        shutdown_kbdfront(kbd_dev);
-
-#ifdef CONFIG_PCIFRONT
-    if (pci_dev)
-        shutdown_pcifront(pci_dev);
-#endif
-}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [minios] Add xenbus shutdown control support
  2012-11-28 21:57 [minios] Add xenbus shutdown control support Samuel Thibault
@ 2012-11-29 11:14 ` Ian Campbell
  2012-12-04  0:30   ` Samuel Thibault
  0 siblings, 1 reply; 5+ messages in thread
From: Ian Campbell @ 2012-11-29 11:14 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: Keir (Xen.org), xen-devel@lists.xen.org

On Wed, 2012-11-28 at 21:57 +0000, Samuel Thibault wrote:
> Add a thread watching the xenbus shutdown control path and notifies a
> wait queue.

Why a wait queue rather than a weak function call?

> Add HYPERVISOR_shutdown convenient inline for minios shutdown.
> 
> Add proper shutdown to the minios test application.

The use of locks in here is pretty exciting, with the up/downs being
spread over various places, but I think I've worked it out and it's only
a test app ;-)

> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> 
> diff -r fdf241ea6ff4 extras/mini-os/include/kernel.h
> --- a/extras/mini-os/include/kernel.h	Wed Nov 28 21:29:18 2012 +0100
> +++ b/extras/mini-os/include/kernel.h	Wed Nov 28 22:53:42 2012 +0100
> @@ -1,6 +1,9 @@
>  #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);
>  
> diff -r fdf241ea6ff4 extras/mini-os/include/x86/x86_32/hypercall-x86_32.h
> --- a/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h	Wed Nov 28 21:29:18 2012 +0100
> +++ b/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h	Wed Nov 28 22:53:42 2012 +0100
> @@ -172,6 +172,14 @@
>  	return _hypercall2(int, sched_op, cmd, arg);
>  }
>  
> +static inline int
> +HYPERVISOR_shutdown(
> +	unsigned int reason)
> +{
> +	struct sched_shutdown shutdown = { .reason = reason };
> +	return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown);
> +}
> +
>  static inline long
>  HYPERVISOR_set_timer_op(
>  	uint64_t timeout)
> diff -r fdf241ea6ff4 extras/mini-os/include/x86/x86_64/hypercall-x86_64.h
> --- a/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h	Wed Nov 28 21:29:18 2012 +0100
> +++ b/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h	Wed Nov 28 22:53:42 2012 +0100
> @@ -176,6 +176,14 @@
>  	return _hypercall2(int, sched_op, cmd, arg);
>  }
>  
> +static inline int
> +HYPERVISOR_shutdown(
> +	unsigned int reason)
> +{
> +	struct sched_shutdown shutdown = { .reason = reason };
> +	return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown);
> +}
> +
>  static inline long
>  HYPERVISOR_set_timer_op(
>  	uint64_t timeout)
> diff -r fdf241ea6ff4 extras/mini-os/kernel.c
> --- a/extras/mini-os/kernel.c	Wed Nov 28 21:29:18 2012 +0100
> +++ b/extras/mini-os/kernel.c	Wed Nov 28 22:53:42 2012 +0100
> @@ -48,6 +48,10 @@
>  
>  uint8_t xen_features[XENFEAT_NR_SUBMAPS * 32];
>  
> +unsigned int do_shutdown = 0;
> +unsigned int shutdown_reason;
> +DECLARE_WAIT_QUEUE_HEAD(shutdown_queue);
> +
>  void setup_xen_features(void)
>  {
>      xen_feature_info_t fi;
> @@ -64,6 +68,36 @@
>      }
>  }
>  
> +static void shutdown_thread(void *p)
> +{
> +    const char *path = "control/shutdown";
> +    const char *token = path;
> +    xenbus_event_queue events = NULL;
> +    char *shutdown, *err;
> +    xenbus_watch_path_token(XBT_NIL, path, token, &events);
> +    while ((err = xenbus_read(XBT_NIL, path, &shutdown)) != NULL)
> +    {
> +        free(err);
> +        xenbus_wait_for_watch(&events);
> +    }
> +    xenbus_unwatch_path_token(XBT_NIL, path, token);
> +    xenbus_write(XBT_NIL, path, "");
> +    printk("Shutting down (%s)\n", shutdown);
> +
> +    if (!strcmp(shutdown, "poweroff"))
> +        shutdown_reason = SHUTDOWN_poweroff;
> +    else if (!strcmp(shutdown, "reboot"))
> +        shutdown_reason = SHUTDOWN_reboot;
> +    else
> +        /* Unknown */
> +        shutdown_reason = SHUTDOWN_crash;
> +    wmb();
> +    do_shutdown = 1;
> +    wmb();
> +    wake_up(&shutdown_queue);
> +}
> +
> +
>  /* This should be overridden by the application we are linked against. */
>  __attribute__((weak)) int app_main(start_info_t *si)
>  {
> @@ -126,6 +160,8 @@
>      /* Init XenBus */
>      init_xenbus();
>  
> +    create_thread("shutdown", shutdown_thread, NULL);
> +
>      /* Call (possibly overridden) app_main() */
>      app_main(&start_info);
>  
> diff -r fdf241ea6ff4 extras/mini-os/test.c
> --- a/extras/mini-os/test.c	Wed Nov 28 21:29:18 2012 +0100
> +++ b/extras/mini-os/test.c	Wed Nov 28 22:53:42 2012 +0100
> @@ -46,6 +46,7 @@
>  #include <xen/version.h>
>  
>  static struct netfront_dev *net_dev;
> +static struct semaphore net_sem = __SEMAPHORE_INITIALIZER(net_sem, 0);
>  
>  void test_xenbus(void);
>  
> @@ -70,12 +71,14 @@
>  static void netfront_thread(void *p)
>  {
>      net_dev = init_netfront(NULL, NULL, NULL, NULL);
> +    up(&net_sem);
>  }
>  
>  static struct blkfront_dev *blk_dev;
>  static struct blkfront_info blk_info;
>  static uint64_t blk_size_read;
>  static uint64_t blk_size_write;
> +static struct semaphore blk_sem = __SEMAPHORE_INITIALIZER(blk_sem, 0);;
>  
>  struct blk_req {
>      struct blkfront_aiocb aiocb;
> @@ -189,8 +192,10 @@
>      time_t lasttime = 0;
>  
>      blk_dev = init_blkfront(NULL, &blk_info);
> -    if (!blk_dev)
> +    if (!blk_dev) {
> +        up(&blk_sem);
>          return;
> +    }
>  
>      if (blk_info.info & VDISK_CDROM)
>          printk("Block device is a CDROM\n");
> @@ -210,7 +215,7 @@
>          blk_read_sector(blk_info.sectors-1);
>      }
>  
> -    while (1) {
> +    while (!do_shutdown) {
>          uint64_t sector = rand() % blk_info.sectors;
>          struct timeval tv;
>  #ifdef BLKTEST_WRITE
> @@ -235,6 +240,7 @@
>          }
>  #endif
>      }
> +    up(&blk_sem);
>  }
>  
>  #define WIDTH 800
> @@ -293,7 +299,6 @@
>      xfree(mfns);
>      if (!fb_dev) {
>          xfree(fb);
> -        return;
>      }
>      up(&fbfront_sem);
>  }
> @@ -330,17 +335,21 @@
>  }
>  
>  static struct kbdfront_dev *kbd_dev;
> +static struct semaphore kbd_sem = __SEMAPHORE_INITIALIZER(kbd_sem, 0);
>  static void kbdfront_thread(void *p)
>  {
>      DEFINE_WAIT(w);
>      DEFINE_WAIT(w2);
> +    DEFINE_WAIT(w3);
>      int x = WIDTH / 2, y = HEIGHT / 2, z = 0;
>  
>      kbd_dev = init_kbdfront(NULL, 1);
> -    if (!kbd_dev)
> +    down(&fbfront_sem);
> +    if (!kbd_dev) {
> +        up(&kbd_sem);
>          return;
> +    }
>  
> -    down(&fbfront_sem);
>      refresh_cursor(x, y);
>      while (1) {
>          union xenkbd_in_event kbdevent;
> @@ -349,6 +358,11 @@
>  
>          add_waiter(w, kbdfront_queue);
>          add_waiter(w2, fbfront_queue);
> +        add_waiter(w3, shutdown_queue);
> +
> +        rmb();
> +        if (do_shutdown)
> +            break;
>  
>          while (kbdfront_receive(kbd_dev, &kbdevent, 1) != 0) {
>              sleep = 0;
> @@ -391,9 +405,11 @@
>                          fbfront_update(fb_dev, x - 16, y - 16, 33, 33);
>                      }
>                  } else if (kbdevent.key.keycode == KEY_Q) {
> -                    struct sched_shutdown sched_shutdown = { .reason = SHUTDOWN_poweroff };
> -                    HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
> -                    do_exit();
> +                    shutdown_reason = SHUTDOWN_poweroff;
> +                    wmb();
> +                    do_shutdown = 1;
> +                    wmb();
> +                    wake_up(&shutdown_queue);
>                  }
>                  break;
>              }
> @@ -410,11 +426,16 @@
>          }
>          if (sleep)
>              schedule();
> +        remove_waiter(w3, shutdown_queue);
> +        remove_waiter(w2, fbfront_queue);
> +        remove_waiter(w, kbdfront_queue);
>      }
> +    up(&kbd_sem);
>  }
>  
>  #ifdef CONFIG_PCIFRONT
>  static struct pcifront_dev *pci_dev;
> +static struct semaphore pci_sem = __SEMAPHORE_INITIALIZER(pci_sem, 0);
>  
>  static void print_pcidev(unsigned int domain, unsigned int bus, unsigned int slot, unsigned int fun)
>  {
> @@ -432,13 +453,60 @@
>  {
>      pcifront_watches(NULL);
>      pci_dev = init_pcifront(NULL);
> -    if (!pci_dev)
> +    if (!pci_dev) {
> +        up(&pci_sem);
>          return;
> +    }
>      printk("PCI devices:\n");
>      pcifront_scan(pci_dev, print_pcidev);
> +    up(&pci_sem);
>  }
>  #endif
>  
> +void shutdown_frontends(void)
> +{
> +    down(&net_sem);
> +    if (net_dev)
> +        shutdown_netfront(net_dev);
> +
> +    down(&blk_sem);
> +    if (blk_dev)
> +        shutdown_blkfront(blk_dev);
> +
> +    if (fb_dev)
> +        shutdown_fbfront(fb_dev);
> +
> +    down(&kbd_sem);
> +    if (kbd_dev)
> +        shutdown_kbdfront(kbd_dev);
> +
> +#ifdef CONFIG_PCIFRONT
> +    down(&pci_sem);
> +    if (pci_dev)
> +        shutdown_pcifront(pci_dev);
> +#endif
> +}
> +
> +static void shutdown_thread(void *p)
> +{
> +    DEFINE_WAIT(w);
> +
> +    while (1) {
> +        add_waiter(w, shutdown_queue);
> +        rmb();
> +        if (do_shutdown) {
> +            rmb();
> +            break;
> +        }
> +        schedule();
> +        remove_waiter(w, shutdown_queue);
> +    }
> +
> +    shutdown_frontends();
> +
> +    HYPERVISOR_shutdown(shutdown_reason);
> +}
> +
>  int app_main(start_info_t *si)
>  {
>      printk("Test main: start_info=%p\n", si);
> @@ -451,25 +519,6 @@
>  #ifdef CONFIG_PCIFRONT
>      create_thread("pcifront", pcifront_thread, si);
>  #endif
> +    create_thread("shutdown", shutdown_thread, si);
>      return 0;
>  }
> -
> -void shutdown_frontends(void)
> -{
> -    if (net_dev)
> -        shutdown_netfront(net_dev);
> -
> -    if (blk_dev)
> -        shutdown_blkfront(blk_dev);
> -
> -    if (fb_dev)
> -        shutdown_fbfront(fb_dev);
> -
> -    if (kbd_dev)
> -        shutdown_kbdfront(kbd_dev);
> -
> -#ifdef CONFIG_PCIFRONT
> -    if (pci_dev)
> -        shutdown_pcifront(pci_dev);
> -#endif
> -}
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [minios] Add xenbus shutdown control support
  2012-11-29 11:14 ` Ian Campbell
@ 2012-12-04  0:30   ` Samuel Thibault
  2012-12-04  9:32     ` Ian Campbell
  0 siblings, 1 reply; 5+ messages in thread
From: Samuel Thibault @ 2012-12-04  0:30 UTC (permalink / raw)
  To: Ian Campbell; +Cc: Keir (Xen.org), xen-devel@lists.xen.org

Re,

Ian Campbell, le Thu 29 Nov 2012 11:14:19 +0000, a écrit :
> On Wed, 2012-11-28 at 21:57 +0000, Samuel Thibault wrote:
> > Add a thread watching the xenbus shutdown control path and notifies a
> > wait queue.
> 
> Why a wait queue rather than a weak function call?

Because it integrates well with existing wait loops.

Samuel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [minios] Add xenbus shutdown control support
  2012-12-04  0:30   ` Samuel Thibault
@ 2012-12-04  9:32     ` Ian Campbell
  2012-12-04  9:40       ` Samuel Thibault
  0 siblings, 1 reply; 5+ messages in thread
From: Ian Campbell @ 2012-12-04  9:32 UTC (permalink / raw)
  To: Samuel Thibault; +Cc: Keir (Xen.org), xen-devel@lists.xen.org

On Tue, 2012-12-04 at 00:30 +0000, Samuel Thibault wrote:
> Re,
> 
> Ian Campbell, le Thu 29 Nov 2012 11:14:19 +0000, a écrit :
> > On Wed, 2012-11-28 at 21:57 +0000, Samuel Thibault wrote:
> > > Add a thread watching the xenbus shutdown control path and notifies a
> > > wait queue.
> > 
> > Why a wait queue rather than a weak function call?
> 
> Because it integrates well with existing wait loops.

I was imagining that someone using such a wait loop would simply provide
the weak function to kick the queue themselves, rather than imposing
this design on them from the core. It's not a big deal though.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [minios] Add xenbus shutdown control support
  2012-12-04  9:32     ` Ian Campbell
@ 2012-12-04  9:40       ` Samuel Thibault
  0 siblings, 0 replies; 5+ messages in thread
From: Samuel Thibault @ 2012-12-04  9:40 UTC (permalink / raw)
  To: Ian Campbell, dgdegra, matthew.fioravante
  Cc: Keir (Xen.org), xen-devel@lists.xen.org

Ian Campbell, le Tue 04 Dec 2012 09:32:45 +0000, a écrit :
> On Tue, 2012-12-04 at 00:30 +0000, Samuel Thibault wrote:
> > Ian Campbell, le Thu 29 Nov 2012 11:14:19 +0000, a écrit :
> > > On Wed, 2012-11-28 at 21:57 +0000, Samuel Thibault wrote:
> > > > Add a thread watching the xenbus shutdown control path and notifies a
> > > > wait queue.
> > > 
> > > Why a wait queue rather than a weak function call?
> > 
> > Because it integrates well with existing wait loops.
> 
> I was imagining that someone using such a wait loop would simply provide
> the weak function to kick the queue themselves,

Ah, right, in that case it doesn't need much synchronization with the
shutdown event, so it doesn't pose problem.

> rather than imposing this design on them from the core. It's not a big
> deal though.

But it's nicer to get it the way people would prefer. Daniel, Matthew,
what do you think?

Samuel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-12-04  9:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-28 21:57 [minios] Add xenbus shutdown control support Samuel Thibault
2012-11-29 11:14 ` Ian Campbell
2012-12-04  0:30   ` Samuel Thibault
2012-12-04  9:32     ` Ian Campbell
2012-12-04  9:40       ` Samuel Thibault

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).