xen: use device model for suspending xenbus devices
Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
This commit is contained in:
parent
a1ce1be578
commit
de5b31bd47
|
@ -104,9 +104,8 @@ static void do_suspend(void)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
printk("suspending xenbus...\n");
|
printk(KERN_DEBUG "suspending xenstore...\n");
|
||||||
/* XXX use normal device tree? */
|
xs_suspend();
|
||||||
xenbus_suspend();
|
|
||||||
|
|
||||||
err = stop_machine(xen_suspend, &cancelled, cpumask_of(0));
|
err = stop_machine(xen_suspend, &cancelled, cpumask_of(0));
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -116,9 +115,9 @@ static void do_suspend(void)
|
||||||
|
|
||||||
if (!cancelled) {
|
if (!cancelled) {
|
||||||
xen_arch_resume();
|
xen_arch_resume();
|
||||||
xenbus_resume();
|
xs_resume();
|
||||||
} else
|
} else
|
||||||
xenbus_suspend_cancel();
|
xs_suspend_cancel();
|
||||||
|
|
||||||
device_resume(PMSG_RESUME);
|
device_resume(PMSG_RESUME);
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,9 @@ static int xenbus_probe_frontend(const char *type, const char *name);
|
||||||
|
|
||||||
static void xenbus_dev_shutdown(struct device *_dev);
|
static void xenbus_dev_shutdown(struct device *_dev);
|
||||||
|
|
||||||
|
static int xenbus_dev_suspend(struct device *dev, pm_message_t state);
|
||||||
|
static int xenbus_dev_resume(struct device *dev);
|
||||||
|
|
||||||
/* If something in array of ids matches this device, return it. */
|
/* If something in array of ids matches this device, return it. */
|
||||||
static const struct xenbus_device_id *
|
static const struct xenbus_device_id *
|
||||||
match_device(const struct xenbus_device_id *arr, struct xenbus_device *dev)
|
match_device(const struct xenbus_device_id *arr, struct xenbus_device *dev)
|
||||||
|
@ -188,6 +191,9 @@ static struct xen_bus_type xenbus_frontend = {
|
||||||
.remove = xenbus_dev_remove,
|
.remove = xenbus_dev_remove,
|
||||||
.shutdown = xenbus_dev_shutdown,
|
.shutdown = xenbus_dev_shutdown,
|
||||||
.dev_attrs = xenbus_dev_attrs,
|
.dev_attrs = xenbus_dev_attrs,
|
||||||
|
|
||||||
|
.suspend = xenbus_dev_suspend,
|
||||||
|
.resume = xenbus_dev_resume,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -669,7 +675,7 @@ static struct xenbus_watch fe_watch = {
|
||||||
.callback = frontend_changed,
|
.callback = frontend_changed,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int suspend_dev(struct device *dev, void *data)
|
static int xenbus_dev_suspend(struct device *dev, pm_message_t state)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct xenbus_driver *drv;
|
struct xenbus_driver *drv;
|
||||||
|
@ -682,14 +688,14 @@ static int suspend_dev(struct device *dev, void *data)
|
||||||
drv = to_xenbus_driver(dev->driver);
|
drv = to_xenbus_driver(dev->driver);
|
||||||
xdev = container_of(dev, struct xenbus_device, dev);
|
xdev = container_of(dev, struct xenbus_device, dev);
|
||||||
if (drv->suspend)
|
if (drv->suspend)
|
||||||
err = drv->suspend(xdev);
|
err = drv->suspend(xdev, state);
|
||||||
if (err)
|
if (err)
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"xenbus: suspend %s failed: %i\n", dev_name(dev), err);
|
"xenbus: suspend %s failed: %i\n", dev_name(dev), err);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int resume_dev(struct device *dev, void *data)
|
static int xenbus_dev_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct xenbus_driver *drv;
|
struct xenbus_driver *drv;
|
||||||
|
@ -734,31 +740,6 @@ static int resume_dev(struct device *dev, void *data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void xenbus_suspend(void)
|
|
||||||
{
|
|
||||||
DPRINTK("");
|
|
||||||
|
|
||||||
bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, suspend_dev);
|
|
||||||
xenbus_backend_suspend(suspend_dev);
|
|
||||||
xs_suspend();
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
xenbus_backend_resume(resume_dev);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(xenbus_resume);
|
|
||||||
|
|
||||||
void xenbus_suspend_cancel(void)
|
|
||||||
{
|
|
||||||
xs_suspend_cancel();
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(xenbus_suspend_cancel);
|
|
||||||
|
|
||||||
/* A flag to determine if xenstored is 'ready' (i.e. has started) */
|
/* A flag to determine if xenstored is 'ready' (i.e. has started) */
|
||||||
int xenstored_ready = 0;
|
int xenstored_ready = 0;
|
||||||
|
|
||||||
|
|
|
@ -673,6 +673,8 @@ void xs_resume(void)
|
||||||
struct xenbus_watch *watch;
|
struct xenbus_watch *watch;
|
||||||
char token[sizeof(watch) * 2 + 1];
|
char token[sizeof(watch) * 2 + 1];
|
||||||
|
|
||||||
|
xb_init_comms();
|
||||||
|
|
||||||
mutex_unlock(&xs_state.response_mutex);
|
mutex_unlock(&xs_state.response_mutex);
|
||||||
mutex_unlock(&xs_state.request_mutex);
|
mutex_unlock(&xs_state.request_mutex);
|
||||||
up_write(&xs_state.transaction_mutex);
|
up_write(&xs_state.transaction_mutex);
|
||||||
|
|
|
@ -91,7 +91,7 @@ struct xenbus_driver {
|
||||||
void (*otherend_changed)(struct xenbus_device *dev,
|
void (*otherend_changed)(struct xenbus_device *dev,
|
||||||
enum xenbus_state backend_state);
|
enum xenbus_state backend_state);
|
||||||
int (*remove)(struct xenbus_device *dev);
|
int (*remove)(struct xenbus_device *dev);
|
||||||
int (*suspend)(struct xenbus_device *dev);
|
int (*suspend)(struct xenbus_device *dev, pm_message_t state);
|
||||||
int (*resume)(struct xenbus_device *dev);
|
int (*resume)(struct xenbus_device *dev);
|
||||||
int (*uevent)(struct xenbus_device *, char **, int, char *, int);
|
int (*uevent)(struct xenbus_device *, char **, int, char *, int);
|
||||||
struct device_driver driver;
|
struct device_driver driver;
|
||||||
|
|
Loading…
Reference in New Issue