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-changelog

[Xen-changelog] [xen-unstable] minios: add proper shutdown facilities

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] minios: add proper shutdown facilities
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 10 Jun 2008 03:40:39 -0700
Delivery-date: Tue, 10 Jun 2008 03:41:33 -0700
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 1213014390 -3600
# Node ID 2197a263a300b3b83509bd3276d762db119fce65
# Parent  8b5b0512ed6a2eb849f2d1b8b694eab8600244dd
minios: add proper shutdown facilities

Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
---
 extras/mini-os/arch/ia64/common.c   |    6 ++++
 extras/mini-os/arch/ia64/time.c     |    6 ++++
 extras/mini-os/arch/x86/setup.c     |   10 +++++++
 extras/mini-os/arch/x86/time.c      |    9 ++++++
 extras/mini-os/arch/x86/traps.c     |    4 +++
 extras/mini-os/blkfront.c           |    2 +
 extras/mini-os/console/console.c    |    5 +++
 extras/mini-os/events.c             |   35 +++++++++++++++++++++++---
 extras/mini-os/fbfront.c            |    4 +++
 extras/mini-os/fs-front.c           |    2 +
 extras/mini-os/gnttab.c             |   11 ++++++++
 extras/mini-os/include/console.h    |    1 
 extras/mini-os/include/events.h     |    1 
 extras/mini-os/include/gnttab.h     |    1 
 extras/mini-os/include/ia64/os.h    |    3 +-
 extras/mini-os/include/ia64/traps.h |    4 +++
 extras/mini-os/include/kernel.h     |    7 +++++
 extras/mini-os/include/mm.h         |    1 
 extras/mini-os/include/netfront.h   |    1 
 extras/mini-os/include/time.h       |    1 
 extras/mini-os/include/x86/os.h     |    4 ++-
 extras/mini-os/include/xenbus.h     |    3 ++
 extras/mini-os/kernel.c             |   48 ++++++++++++++++++++++++++++++++++--
 extras/mini-os/lwip-net.c           |    6 ++++
 extras/mini-os/mm.c                 |    4 +++
 extras/mini-os/netfront.c           |    2 +
 extras/mini-os/xenbus/xenbus.c      |   17 +++++++++---
 27 files changed, 185 insertions(+), 13 deletions(-)

diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/arch/ia64/common.c
--- a/extras/mini-os/arch/ia64/common.c Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/arch/ia64/common.c Mon Jun 09 13:26:30 2008 +0100
@@ -236,6 +236,12 @@ arch_init(start_info_t *si)
 }
 
 void
+arch_fini(void)
+{
+       /* TODO */
+}
+
+void
 arch_print_info(void)
 {
        int major, minor;
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/arch/ia64/time.c
--- a/extras/mini-os/arch/ia64/time.c   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/arch/ia64/time.c   Mon Jun 09 13:26:30 2008 +0100
@@ -280,3 +280,9 @@ init_time(void)
        ia64_set_itm(new);
        ia64_srlz_d();
 }
+
+void
+fini_time(void)
+{
+       /* TODO */
+}
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/arch/x86/setup.c
--- a/extras/mini-os/arch/x86/setup.c   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/arch/x86/setup.c   Mon Jun 09 13:26:30 2008 +0100
@@ -100,6 +100,16 @@ arch_init(start_info_t *si)
 }
 
 void
+arch_fini(void)
+{
+#ifdef __i386__
+       HYPERVISOR_set_callbacks(0, 0, 0, 0);
+#else
+       HYPERVISOR_set_callbacks(0, 0, 0);
+#endif
+}
+
+void
 arch_print_info(void)
 {
        printk("  stack:      %p-%p\n", stack, stack + sizeof(stack));
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/arch/x86/time.c
--- a/extras/mini-os/arch/x86/time.c    Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/arch/x86/time.c    Mon Jun 09 13:26:30 2008 +0100
@@ -222,10 +222,17 @@ static void timer_handler(evtchn_port_t 
 
 
 
+static evtchn_port_t port;
 void init_time(void)
 {
-    evtchn_port_t port;
     printk("Initialising timer interface\n");
     port = bind_virq(VIRQ_TIMER, &timer_handler, NULL);
     unmask_evtchn(port);
 }
+
+void fini_time(void)
+{
+    /* Clear any pending timer */
+    HYPERVISOR_set_timer_op(0);
+    unbind_evtchn(port);
+}
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/arch/x86/traps.c
--- a/extras/mini-os/arch/x86/traps.c   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/arch/x86/traps.c   Mon Jun 09 13:26:30 2008 +0100
@@ -268,3 +268,7 @@ void trap_init(void)
     HYPERVISOR_set_trap_table(trap_table);    
 }
 
+void trap_fini(void)
+{
+    HYPERVISOR_set_trap_table(NULL);
+}
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/blkfront.c
--- a/extras/mini-os/blkfront.c Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/blkfront.c Mon Jun 09 13:26:30 2008 +0100
@@ -239,6 +239,8 @@ void shutdown_blkfront(struct blkfront_d
     xenbus_wait_for_value(path, "6", &dev->events);
 
     xenbus_unwatch_path(XBT_NIL, path);
+
+    err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1);
 
     free_blkfront(dev);
 }
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/console/console.c
--- a/extras/mini-os/console/console.c  Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/console/console.c  Mon Jun 09 13:26:30 2008 +0100
@@ -150,3 +150,8 @@ void init_console(void)
     /* This is also required to notify the daemon */
     printk("done.\n");
 }
+
+void fini_console(void)
+{
+    /* Destruct the console and get the parameters of the restarted one */
+}
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/events.c
--- a/extras/mini-os/events.c   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/events.c   Mon Jun 09 13:26:30 2008 +0100
@@ -39,19 +39,29 @@ void unbind_all_ports(void)
 void unbind_all_ports(void)
 {
     int i;
+    int cpu = 0;
+    shared_info_t *s = HYPERVISOR_shared_info;
+    vcpu_info_t   *vcpu_info = &s->vcpu_info[cpu];
 
     for (i = 0; i < NR_EVS; i++)
     {
+        if (i == start_info.console.domU.evtchn ||
+            i == start_info.store_evtchn)
+            continue;
         if (test_and_clear_bit(i, bound_ports))
         {
             struct evtchn_close close;
+            printk("port %d still bound!\n", i);
             mask_evtchn(i);
             close.port = i;
             HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
+            clear_evtchn(i);
         }
     }
-}
-  
+    vcpu_info->evtchn_upcall_pending = 0;
+    vcpu_info->evtchn_pending_sel = 0;
+}
+
 /*
  * Demux events to different handlers.
  */
@@ -86,17 +96,27 @@ evtchn_port_t bind_evtchn(evtchn_port_t 
        ev_actions[port].data = data;
        wmb();
        ev_actions[port].handler = handler;
+       set_bit(port, bound_ports);
 
        return port;
 }
 
 void unbind_evtchn(evtchn_port_t port )
 {
+       struct evtchn_close close;
+
        if (ev_actions[port].handler == default_handler)
                printk("WARN: No handler for port %d when unbinding\n", port);
+       mask_evtchn(port);
+       clear_evtchn(port);
+
        ev_actions[port].handler = default_handler;
        wmb();
        ev_actions[port].data = NULL;
+       clear_bit(port, bound_ports);
+
+       close.port = port;
+       HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
 }
 
 evtchn_port_t bind_virq(uint32_t virq, evtchn_handler_t handler, void *data)
@@ -112,7 +132,6 @@ evtchn_port_t bind_virq(uint32_t virq, e
                printk("Failed to bind virtual IRQ %d\n", virq);
                return -1;
     }
-    set_bit(op.port,bound_ports);
     bind_evtchn(op.port, handler, data);
        return op.port;
 }
@@ -145,6 +164,15 @@ void init_events(void)
         ev_actions[i].handler = default_handler;
         mask_evtchn(i);
     }
+}
+
+void fini_events(void)
+{
+    /* Dealloc all events */
+    unbind_all_ports();
+#if defined(__x86_64__)
+    wrmsrl(0xc0000101, NULL); /* 0xc0000101 is MSR_GS_BASE */
+#endif
 }
 
 void default_handler(evtchn_port_t port, struct pt_regs *regs, void *ignore)
@@ -185,7 +213,6 @@ int evtchn_bind_interdomain(domid_t pal,
     int err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain, &op);
     if (err)
                return err;
-    set_bit(op.local_port,bound_ports);
     evtchn_port_t port = op.local_port;
     *local_port = bind_evtchn(port, handler, data);
     return err;
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/fbfront.c
--- a/extras/mini-os/fbfront.c  Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/fbfront.c  Mon Jun 09 13:26:30 2008 +0100
@@ -225,6 +225,8 @@ void shutdown_kbdfront(struct kbdfront_d
 
     xenbus_unwatch_path(XBT_NIL, path);
 
+    err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1);
+
     free_kbdfront(dev);
 }
 
@@ -549,6 +551,8 @@ void shutdown_fbfront(struct fbfront_dev
 
     xenbus_unwatch_path(XBT_NIL, path);
 
+    err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1);
+
     unbind_evtchn(dev->evtchn);
 
     free_fbfront(dev);
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/fs-front.c
--- a/extras/mini-os/fs-front.c Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/fs-front.c Mon Jun 09 13:26:30 2008 +0100
@@ -1127,3 +1127,5 @@ void init_fs_frontend(void)
     if (!fs_import)
        printk("No FS import\n");
 }
+
+/* TODO: shutdown */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/gnttab.c
--- a/extras/mini-os/gnttab.c   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/gnttab.c   Mon Jun 09 13:26:30 2008 +0100
@@ -193,3 +193,14 @@ init_gnttab(void)
     gnttab_table = map_frames(frames, NR_GRANT_FRAMES);
     printk("gnttab_table mapped at %p.\n", gnttab_table);
 }
+
+void
+fini_gnttab(void)
+{
+    struct gnttab_setup_table setup;
+
+    setup.dom = DOMID_SELF;
+    setup.nr_frames = 0;
+
+    HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
+}
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/console.h
--- a/extras/mini-os/include/console.h  Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/console.h  Mon Jun 09 13:26:30 2008 +0100
@@ -51,6 +51,7 @@ void xencons_tx(void);
 
 void init_console(void);
 void console_print(char *data, int length);
+void fini_console(void);
 
 /* Low level functions defined in xencons_ring.c */
 extern struct wait_queue_head console_queue;
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/events.h
--- a/extras/mini-os/include/events.h   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/events.h   Mon Jun 09 13:26:30 2008 +0100
@@ -45,5 +45,6 @@ static inline int notify_remote_via_evtc
     return HYPERVISOR_event_channel_op(EVTCHNOP_send, &op);
 }
 
+void fini_events(void);
 
 #endif /* _EVENTS_H_ */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/gnttab.h
--- a/extras/mini-os/include/gnttab.h   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/gnttab.h   Mon Jun 09 13:26:30 2008 +0100
@@ -11,5 +11,6 @@ unsigned long gnttab_end_transfer(grant_
 unsigned long gnttab_end_transfer(grant_ref_t gref);
 int gnttab_end_access(grant_ref_t ref);
 const char *gnttabop_error(int16_t status);
+void fini_gnttab(void);
 
 #endif /* !__GNTTAB_H__ */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/ia64/os.h
--- a/extras/mini-os/include/ia64/os.h  Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/ia64/os.h  Mon Jun 09 13:26:30 2008 +0100
@@ -35,6 +35,7 @@
 #include "sal.h"
 #include "pal.h"
 #include "hypervisor.h"
+#include <kernel.h>
 
 
 typedef uint64_t paddr_t;              /* Physical address. */
@@ -46,9 +47,9 @@ typedef uint64_t caddr_t;             /* rr7/kernel
 #include "mm.h"
 
 
-void do_exit(void) __attribute__((noreturn));
 void arch_init(start_info_t *si);      /* in common.c */
 void arch_print_info(void);            /* in common.c */
+void arch_fini(void);
 
 
 /* Size of xen_ia64_boot_param.command_line */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/ia64/traps.h
--- a/extras/mini-os/include/ia64/traps.h       Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/ia64/traps.h       Mon Jun 09 13:26:30 2008 +0100
@@ -38,6 +38,10 @@ inline static void trap_init(void)
 {
        //printk("trap_init() until now not needed!\n");
 }
+inline static void trap_fini(void)
+{
+       //printk("trap_fini() until now not needed!\n");
+}
 
 
 #endif /* !defined(__ASSEMBLY__) */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/kernel.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/extras/mini-os/include/kernel.h   Mon Jun 09 13:26:30 2008 +0100
@@ -0,0 +1,7 @@
+#ifndef _KERNEL_H_
+#define _KERNEL_H_
+
+extern void do_exit(void) __attribute__((noreturn));
+extern void stop_kernel(void);
+
+#endif /* _KERNEL_H_ */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/mm.h
--- a/extras/mini-os/include/mm.h       Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/mm.h       Mon Jun 09 13:26:30 2008 +0100
@@ -75,5 +75,6 @@ extern unsigned long heap, brk, heap_map
 #endif
 
 int free_physical_pages(xen_pfn_t *mfns, int n);
+void fini_mm(void);
 
 #endif /* _MM_H_ */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/netfront.h
--- a/extras/mini-os/include/netfront.h Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/netfront.h Mon Jun 09 13:26:30 2008 +0100
@@ -18,6 +18,7 @@ extern struct wait_queue_head netfront_q
  * N.B. _must_ be called from a thread; it's not safe to call this from 
  * app_main(). */
 void start_networking(void);
+void stop_networking(void);
 
 void networking_set_addr(struct ip_addr *ipaddr, struct ip_addr *netmask, 
struct ip_addr *gw);
 #endif
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/time.h
--- a/extras/mini-os/include/time.h     Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/time.h     Mon Jun 09 13:26:30 2008 +0100
@@ -54,6 +54,7 @@ typedef long suseconds_t;
 
 /* prototypes */
 void     init_time(void);
+void     fini_time(void);
 s_time_t get_s_time(void);
 s_time_t get_v_time(void);
 u64      monotonic_clock(void);
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/x86/os.h
--- a/extras/mini-os/include/x86/os.h   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/x86/os.h   Mon Jun 09 13:26:30 2008 +0100
@@ -18,10 +18,10 @@
 #ifndef __ASSEMBLY__
 #include <types.h>
 #include <hypervisor.h>
+#include <kernel.h>
 
 #define USED    __attribute__ ((used))
 
-extern void do_exit(void) __attribute__((noreturn));
 #define BUG do_exit
 
 #endif
@@ -61,9 +61,11 @@ extern shared_info_t *HYPERVISOR_shared_
 extern shared_info_t *HYPERVISOR_shared_info;
 
 void trap_init(void);
+void trap_fini(void);
 
 void arch_init(start_info_t *si);
 void arch_print_info(void);
+void arch_fini(void);
 
 
 
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/include/xenbus.h
--- a/extras/mini-os/include/xenbus.h   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/include/xenbus.h   Mon Jun 09 13:26:30 2008 +0100
@@ -90,4 +90,7 @@ char* xenbus_printf(xenbus_transaction_t
                                   char* node, char* path,
                                   char* fmt, ...);
 
+/* Reset the XenBus system. */
+void fini_xenbus(void);
+
 #endif /* XENBUS_H__ */
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/kernel.c
--- a/extras/mini-os/kernel.c   Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/kernel.c   Mon Jun 09 13:26:30 2008 +0100
@@ -46,6 +46,7 @@
 #include <xen/features.h>
 #include <xen/version.h>
 
+static struct netfront_dev *net_dev;
 
 u8 xen_features[XENFEAT_NR_SUBMAPS * 32];
 
@@ -87,7 +88,7 @@ static void periodic_thread(void *p)
 
 static void netfront_thread(void *p)
 {
-    init_netfront(NULL, NULL, NULL, NULL);
+    net_dev = init_netfront(NULL, NULL, NULL, NULL);
 }
 
 static struct blkfront_dev *blk_dev;
@@ -347,9 +348,9 @@ static void refresh_cursor(int new_x, in
     fbfront_update(fb_dev, new_x, new_y, 9, 9);
 }
 
+static struct kbdfront_dev *kbd_dev;
 static void kbdfront_thread(void *p)
 {
-    struct kbdfront_dev *kbd_dev;
     DEFINE_WAIT(w);
     int x = WIDTH / 2, y = HEIGHT / 2, z = 0;
 
@@ -509,6 +510,49 @@ void start_kernel(start_info_t *si)
     run_idle_thread();
 }
 
+void stop_kernel(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);
+
+    /* TODO: fs import */
+
+    local_irq_disable();
+
+    /* Reset grant tables */
+    fini_gnttab();
+
+    /* Reset the console driver. */
+    fini_console();
+    /* TODO: record new ring mfn & event in start_info */
+
+    /* Reset XenBus */
+    fini_xenbus();
+
+    /* Reset timers */
+    fini_time();
+
+    /* Reset memory management. */
+    fini_mm();
+
+    /* Reset events. */
+    fini_events();
+
+    /* Reset traps */
+    trap_fini();
+
+    /* Reset arch details */
+    arch_fini();
+}
 
 /*
  * do_exit: This is called whenever an IRET fails in entry.S.
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/lwip-net.c
--- a/extras/mini-os/lwip-net.c Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/lwip-net.c Mon Jun 09 13:26:30 2008 +0100
@@ -376,3 +376,9 @@ void start_networking(void)
 
   tprintk("Network is ready.\n");
 }
+
+/* Shut down the network */
+void stop_networking(void)
+{
+  shutdown_netfront(dev);
+}
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/mm.c
--- a/extras/mini-os/mm.c       Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/mm.c       Mon Jun 09 13:26:30 2008 +0100
@@ -419,6 +419,10 @@ void init_mm(void)
     arch_init_demand_mapping_area(max_pfn);
 }
 
+void fini_mm(void)
+{
+}
+
 void sanity_check(void)
 {
     int x;
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/netfront.c
--- a/extras/mini-os/netfront.c Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/netfront.c Mon Jun 09 13:26:30 2008 +0100
@@ -501,6 +501,8 @@ void shutdown_netfront(struct netfront_d
 
     xenbus_unwatch_path(XBT_NIL, path);
 
+    err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1);
+
     free_netfront(dev);
 }
 
diff -r 8b5b0512ed6a -r 2197a263a300 extras/mini-os/xenbus/xenbus.c
--- a/extras/mini-os/xenbus/xenbus.c    Mon Jun 09 13:26:05 2008 +0100
+++ b/extras/mini-os/xenbus/xenbus.c    Mon Jun 09 13:26:30 2008 +0100
@@ -124,7 +124,7 @@ static void xenbus_thread_func(void *ign
 static void xenbus_thread_func(void *ign)
 {
     struct xsd_sockmsg msg;
-    unsigned prod = 0;
+    unsigned prod = xenstore_buf->rsp_prod;
 
     for (;;) 
     {
@@ -174,9 +174,14 @@ static void xenbus_thread_func(void *ign
                         break;
                     }
 
-               event->next = *events;
-               *events = event;
-                wake_up(&xenbus_watch_queue);
+                if (events) {
+                    event->next = *events;
+                    *events = event;
+                    wake_up(&xenbus_watch_queue);
+                } else {
+                    printk("unexpected watch token %s\n", event->token);
+                    free(event);
+                }
             }
 
             else
@@ -263,6 +268,10 @@ void init_xenbus(void)
               NULL);
     unmask_evtchn(start_info.store_evtchn);
     DEBUG("xenbus on irq %d\n", err);
+}
+
+void fini_xenbus(void)
+{
 }
 
 /* Send data to xenbus.  This can block.  All of the requests are seen

_______________________________________________
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] minios: add proper shutdown facilities, Xen patchbot-unstable <=