[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 6/6] xen kexec: reset device state to Initializing during reboot


  • To: xen-devel@xxxxxxxxxxxxxxxxxxx
  • From: Olaf Hering <olaf@xxxxxxxxx>
  • Date: Tue, 26 Jul 2011 13:52:15 +0200
  • Delivery-date: Tue, 26 Jul 2011 04:53:57 -0700
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

During kexec all devices will be shutdown, the backend drivers enter the
Closed state. But in this state the kexec kernel can not connect to the
backend because it expects the devices in InitWait state.
After triggering the Closing event, trigger also the Initializing event
and wait until the backend has changed its state. Without this waiting
the kexec kernel may find a device where a state change is still in
progress.

Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
---
 drivers/xen/xenbus/xenbus_probe.c |   23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

Index: linux-3.0/drivers/xen/xenbus/xenbus_probe.c
===================================================================
--- linux-3.0.orig/drivers/xen/xenbus/xenbus_probe.c
+++ linux-3.0/drivers/xen/xenbus/xenbus_probe.c
@@ -192,8 +192,19 @@ void xenbus_otherend_changed(struct xenb
         * work that can fail e.g., when the rootfs is gone.
         */
        if (system_state > SYSTEM_RUNNING) {
-               if (ignore_on_shutdown && (state == XenbusStateClosing))
-                       xenbus_frontend_closed(dev);
+               if (ignore_on_shutdown) {
+                       switch (state) {
+                       case XenbusStateClosing:
+                               xenbus_frontend_closed(dev);
+                               break;
+                       case XenbusStateInitialising:
+                       case XenbusStateInitWait:
+                               complete(&dev->down);
+                               break;
+                       default:
+                               break;
+                       }
+               }
                return;
        }
 
@@ -284,6 +295,14 @@ void xenbus_dev_shutdown(struct device *
        if (!timeout)
                printk(KERN_INFO "%s: %s timeout closing device\n",
                       __func__, dev->nodename);
+
+       if (system_state > SYSTEM_RUNNING) {
+               xenbus_switch_state(dev, XenbusStateInitialising);
+               timeout = wait_for_completion_timeout(&dev->down, timeout);
+               if (!timeout)
+                       printk(KERN_INFO "%s: %s timeout initializing device\n",
+                              __func__, dev->nodename);
+       }
  out:
        put_device(&dev->dev);
 }


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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.