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 4 of 7] Make xen_suspend handle resume

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 4 of 7] Make xen_suspend handle resume
From: Brendan Cully <brendan@xxxxxxxxx>
Date: Mon, 15 Jan 2007 12:05:14 -0700
Delivery-date: Mon, 15 Jan 2007 12:12:24 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1168891510@xxxxxxxxxxxxxxxxx>
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>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Brendan Cully <brendan@xxxxxxxxx>
# Date 1168891374 28800
# Node ID 5faad71162917237df8c8574f0186981b621a161
# Parent  477813c50e5db59ae08d346288edf19eaf19dbcb
Make xen_suspend handle resume.

Don't destroy xenstore watches on suspend, and only recreate them when
resuming in a new domain. Likewise, only invoke frontend device resume
code when in a new domain (the resume functions all tear down the
existing function and wait for the backend to negotiate a new one,
which does not happen in the source domain).

Signed-off-by: Brendan Cully <brendan@xxxxxxxxx>

diff -r 477813c50e5d -r 5faad7116291 
linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c    Mon Jan 15 
12:02:54 2007 -0800
+++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c    Mon Jan 15 
12:02:54 2007 -0800
@@ -85,13 +85,20 @@ static void pre_suspend(void)
                mfn_to_pfn(xen_start_info->console.domU.mfn);
 }
 
-static void post_suspend(void)
+static void post_suspend(int reconnect)
 {
        int i, j, k, fpp;
        extern unsigned long max_pfn;
        extern unsigned long *pfn_to_mfn_frame_list_list;
        extern unsigned long *pfn_to_mfn_frame_list[];
 
+       if (!reconnect) {
+               xen_start_info->store_mfn =
+                       pfn_to_mfn(xen_start_info->store_mfn);
+               xen_start_info->console.domU.mfn =
+                       pfn_to_mfn(xen_start_info->console.domU.mfn);
+       }
+       
        set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
 
        HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
@@ -120,7 +127,7 @@ static void post_suspend(void)
 #define switch_idle_mm()       ((void)0)
 #define mm_pin_all()           ((void)0)
 #define pre_suspend()          ((void)0)
-#define post_suspend()         ((void)0)
+#define post_suspend(x)                ((void)0)
 
 #endif
 
@@ -158,16 +165,18 @@ int __xen_suspend(void)
        pre_suspend();
 
        /*
-        * We'll stop somewhere inside this hypercall. When it returns,
-        * we'll start resuming after the restore.
+        * This hypercall returns 1 if suspend was cancelled or
+        * the domain was merely checkpointed, and 0 if it is
+        * resuming in a new domain.
         */
-       HYPERVISOR_suspend(virt_to_mfn(xen_start_info));
+       err = !HYPERVISOR_suspend(virt_to_mfn(xen_start_info));
 
-       post_suspend();
+       post_suspend(err);
 
        gnttab_resume();
 
-       irq_resume();
+       if (err)
+               irq_resume();
 
        time_resume();
 
@@ -175,9 +184,10 @@ int __xen_suspend(void)
 
        local_irq_enable();
 
-       xencons_resume();
+       if (err)
+               xencons_resume();
 
-       xenbus_resume();
+       xenbus_resume(err);
 
        smp_resume();
 
diff -r 477813c50e5d -r 5faad7116291 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Mon Jan 15 
12:02:54 2007 -0800
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Mon Jan 15 
12:02:54 2007 -0800
@@ -727,11 +727,15 @@ void xenbus_suspend(void)
 }
 EXPORT_SYMBOL_GPL(xenbus_suspend);
 
-void xenbus_resume(void)
-{
-       xb_init_comms();
-       xs_resume();
-       bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, resume_dev);
+void xenbus_resume(int reconnect)
+{
+       if (reconnect)
+               xb_init_comms();
+       xs_resume(reconnect);
+
+       if (reconnect) {
+               bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, resume_dev);
+       }
        xenbus_backend_resume(resume_dev);
 }
 EXPORT_SYMBOL_GPL(xenbus_resume);
diff -r 477813c50e5d -r 5faad7116291 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c       Mon Jan 15 
12:02:54 2007 -0800
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c       Mon Jan 15 
12:02:54 2007 -0800
@@ -668,31 +668,23 @@ EXPORT_SYMBOL_GPL(unregister_xenbus_watc
 
 void xs_suspend(void)
 {
+       down_write(&xs_state.suspend_mutex);
+       mutex_lock(&xs_state.request_mutex);
+}
+
+void xs_resume(int reconnect)
+{
        struct xenbus_watch *watch;
        char token[sizeof(watch) * 2 + 1];
 
-       down_write(&xs_state.suspend_mutex);
-
-       /* No need for watches_lock: the suspend_mutex is sufficient. */
-       list_for_each_entry(watch, &watches, list) {
-               sprintf(token, "%lX", (long)watch);
-               xs_unwatch(watch->node, token);
-       }
-
-       mutex_lock(&xs_state.request_mutex);
-}
-
-void xs_resume(void)
-{
-       struct xenbus_watch *watch;
-       char token[sizeof(watch) * 2 + 1];
-
        mutex_unlock(&xs_state.request_mutex);
 
-       /* No need for watches_lock: the suspend_mutex is sufficient. */
-       list_for_each_entry(watch, &watches, list) {
-               sprintf(token, "%lX", (long)watch);
-               xs_watch(watch->node, token);
+       if (reconnect) {
+               /* No need for watches_lock: the suspend_mutex is sufficient. */
+               list_for_each_entry(watch, &watches, list) {
+                       sprintf(token, "%lX", (long)watch);
+                       xs_watch(watch->node, token);
+               }
        }
 
        up_write(&xs_state.suspend_mutex);
diff -r 477813c50e5d -r 5faad7116291 linux-2.6-xen-sparse/include/xen/xenbus.h
--- a/linux-2.6-xen-sparse/include/xen/xenbus.h Mon Jan 15 12:02:54 2007 -0800
+++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Mon Jan 15 12:02:54 2007 -0800
@@ -159,14 +159,14 @@ int register_xenbus_watch(struct xenbus_
 int register_xenbus_watch(struct xenbus_watch *watch);
 void unregister_xenbus_watch(struct xenbus_watch *watch);
 void xs_suspend(void);
-void xs_resume(void);
+void xs_resume(int reconnect);
 
 /* Used by xenbus_dev to borrow kernel's store connection. */
 void *xenbus_dev_request_and_reply(struct xsd_sockmsg *msg);
 
 /* Called from xen core code. */
 void xenbus_suspend(void);
-void xenbus_resume(void);
+void xenbus_resume(int reconnect);
 
 #define XENBUS_IS_ERR_READ(str) ({                     \
        if (!IS_ERR(str) && strlen(str) == 0) {         \

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel