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

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



On Tue, 26 Jul 2011, Olaf Hering wrote:
> 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);
>  }

It looks like this code path is going to be triggered every time we shut
down a PV on HVM guest. I think we should avoid going into
XenbusStateInitialising on normal shut down or reboot.

_______________________________________________
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®.