xenbus: move xenbus_dev_shutdown() into frontend code...
...and make it static xenbus_dev_shutdown() is seemingly intended to cause clean shutdown of PV frontends when a guest is rebooted. Indeed the function waits for a conpletion which is only set by a call to xenbus_frontend_closed(). This patch removes the shutdown() method from backends and moves xenbus_dev_shutdown() from xenbus_probe.c into xenbus_probe_frontend.c, renaming it appropriately and making it static. NOTE: In the case where the backend is running in a driver domain, the toolstack should have already terminated any frontends that may be using it (since Xen does not support re-startable PV driver domains) so xenbus_dev_shutdown() should never be called. Signed-off-by: Paul Durrant <pdurrant@amazon.com> Reviewed-by: Juergen Gross <jgross@suse.com> Signed-off-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
parent
589b72894f
commit
c534374ecf
|
@ -116,8 +116,6 @@ int xenbus_probe_devices(struct xen_bus_type *bus);
|
||||||
|
|
||||||
void xenbus_dev_changed(const char *node, struct xen_bus_type *bus);
|
void xenbus_dev_changed(const char *node, struct xen_bus_type *bus);
|
||||||
|
|
||||||
void xenbus_dev_shutdown(struct device *_dev);
|
|
||||||
|
|
||||||
int xenbus_dev_suspend(struct device *dev);
|
int xenbus_dev_suspend(struct device *dev);
|
||||||
int xenbus_dev_resume(struct device *dev);
|
int xenbus_dev_resume(struct device *dev);
|
||||||
int xenbus_dev_cancel(struct device *dev);
|
int xenbus_dev_cancel(struct device *dev);
|
||||||
|
|
|
@ -281,29 +281,6 @@ int xenbus_dev_remove(struct device *_dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(xenbus_dev_remove);
|
EXPORT_SYMBOL_GPL(xenbus_dev_remove);
|
||||||
|
|
||||||
void xenbus_dev_shutdown(struct device *_dev)
|
|
||||||
{
|
|
||||||
struct xenbus_device *dev = to_xenbus_device(_dev);
|
|
||||||
unsigned long timeout = 5*HZ;
|
|
||||||
|
|
||||||
DPRINTK("%s", dev->nodename);
|
|
||||||
|
|
||||||
get_device(&dev->dev);
|
|
||||||
if (dev->state != XenbusStateConnected) {
|
|
||||||
pr_info("%s: %s: %s != Connected, skipping\n",
|
|
||||||
__func__, dev->nodename, xenbus_strstate(dev->state));
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
xenbus_switch_state(dev, XenbusStateClosing);
|
|
||||||
timeout = wait_for_completion_timeout(&dev->down, timeout);
|
|
||||||
if (!timeout)
|
|
||||||
pr_info("%s: %s timeout closing device\n",
|
|
||||||
__func__, dev->nodename);
|
|
||||||
out:
|
|
||||||
put_device(&dev->dev);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(xenbus_dev_shutdown);
|
|
||||||
|
|
||||||
int xenbus_register_driver_common(struct xenbus_driver *drv,
|
int xenbus_register_driver_common(struct xenbus_driver *drv,
|
||||||
struct xen_bus_type *bus,
|
struct xen_bus_type *bus,
|
||||||
struct module *owner, const char *mod_name)
|
struct module *owner, const char *mod_name)
|
||||||
|
|
|
@ -198,7 +198,6 @@ static struct xen_bus_type xenbus_backend = {
|
||||||
.uevent = xenbus_uevent_backend,
|
.uevent = xenbus_uevent_backend,
|
||||||
.probe = xenbus_dev_probe,
|
.probe = xenbus_dev_probe,
|
||||||
.remove = xenbus_dev_remove,
|
.remove = xenbus_dev_remove,
|
||||||
.shutdown = xenbus_dev_shutdown,
|
|
||||||
.dev_groups = xenbus_dev_groups,
|
.dev_groups = xenbus_dev_groups,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -126,6 +126,28 @@ static int xenbus_frontend_dev_probe(struct device *dev)
|
||||||
return xenbus_dev_probe(dev);
|
return xenbus_dev_probe(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void xenbus_frontend_dev_shutdown(struct device *_dev)
|
||||||
|
{
|
||||||
|
struct xenbus_device *dev = to_xenbus_device(_dev);
|
||||||
|
unsigned long timeout = 5*HZ;
|
||||||
|
|
||||||
|
DPRINTK("%s", dev->nodename);
|
||||||
|
|
||||||
|
get_device(&dev->dev);
|
||||||
|
if (dev->state != XenbusStateConnected) {
|
||||||
|
pr_info("%s: %s: %s != Connected, skipping\n",
|
||||||
|
__func__, dev->nodename, xenbus_strstate(dev->state));
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
xenbus_switch_state(dev, XenbusStateClosing);
|
||||||
|
timeout = wait_for_completion_timeout(&dev->down, timeout);
|
||||||
|
if (!timeout)
|
||||||
|
pr_info("%s: %s timeout closing device\n",
|
||||||
|
__func__, dev->nodename);
|
||||||
|
out:
|
||||||
|
put_device(&dev->dev);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct dev_pm_ops xenbus_pm_ops = {
|
static const struct dev_pm_ops xenbus_pm_ops = {
|
||||||
.suspend = xenbus_dev_suspend,
|
.suspend = xenbus_dev_suspend,
|
||||||
.resume = xenbus_frontend_dev_resume,
|
.resume = xenbus_frontend_dev_resume,
|
||||||
|
@ -146,7 +168,7 @@ static struct xen_bus_type xenbus_frontend = {
|
||||||
.uevent = xenbus_uevent_frontend,
|
.uevent = xenbus_uevent_frontend,
|
||||||
.probe = xenbus_frontend_dev_probe,
|
.probe = xenbus_frontend_dev_probe,
|
||||||
.remove = xenbus_dev_remove,
|
.remove = xenbus_dev_remove,
|
||||||
.shutdown = xenbus_dev_shutdown,
|
.shutdown = xenbus_frontend_dev_shutdown,
|
||||||
.dev_groups = xenbus_dev_groups,
|
.dev_groups = xenbus_dev_groups,
|
||||||
|
|
||||||
.pm = &xenbus_pm_ops,
|
.pm = &xenbus_pm_ops,
|
||||||
|
|
Loading…
Reference in New Issue