summaryrefslogtreecommitdiffstats
path: root/sys/xen
diff options
context:
space:
mode:
authorgibbs <gibbs@FreeBSD.org>2011-09-20 23:44:34 +0000
committergibbs <gibbs@FreeBSD.org>2011-09-20 23:44:34 +0000
commit44b315b7fba0d3c49e1c4105b487818147889198 (patch)
tree6b8fcd349b3da3727d19a4671541e3c2563ca2d8 /sys/xen
parent100c4e486409077285a2380623bf6686932020dc (diff)
downloadFreeBSD-src-44b315b7fba0d3c49e1c4105b487818147889198.zip
FreeBSD-src-44b315b7fba0d3c49e1c4105b487818147889198.tar.gz
Properly handle suspend/resume events in the Xen device
framework. Sponsored by: BQ Internet sys/xen/xenbus/xenbusb.c: o In xenbusb_resume(), publish the state transition of the resuming device into XenbusStateIntiailising so that the remote peer can see it. Recording the state locally is not sufficient to trigger a re-connect sequence. o In xenbusb_resume(), defer new-bus resume processing until after the remote peer's XenStore address has been updated. The drivers may need to refer to this information during resume processing. sys/xen/xenbus/xenbusb_back.c: sys/xen/xenbus/xenbusb_front.c: Register xenbusb_resume() rather than bus_generic_resume() as the handler for device_resume events. sys/xen/xenstore/xenstore.c: o Fix grammer in a comment. o In xs_suspend(), pass suspend events on to the child devices (e.g. xenbusb_front/back, that are attached to the XenStore. Approved by: re MFC after: 1 week
Diffstat (limited to 'sys/xen')
-rw-r--r--sys/xen/xenbus/xenbusb.c8
-rw-r--r--sys/xen/xenbus/xenbusb_back.c2
-rw-r--r--sys/xen/xenbus/xenbusb_front.c2
-rw-r--r--sys/xen/xenstore/xenstore.c15
4 files changed, 18 insertions, 9 deletions
diff --git a/sys/xen/xenbus/xenbusb.c b/sys/xen/xenbus/xenbusb.c
index cc519c5..3e2d56f 100644
--- a/sys/xen/xenbus/xenbusb.c
+++ b/sys/xen/xenbus/xenbusb.c
@@ -773,7 +773,7 @@ xenbusb_resume(device_t dev)
ivars = device_get_ivars(kids[i]);
xs_unregister_watch(&ivars->xd_otherend_watch);
- ivars->xd_state = XenbusStateInitialising;
+ xenbus_set_state(kids[i], XenbusStateInitialising);
/*
* Find the new backend details and
@@ -783,16 +783,16 @@ xenbusb_resume(device_t dev)
if (error)
return (error);
- DEVICE_RESUME(kids[i]);
-
statepath = malloc(ivars->xd_otherend_path_len
+ strlen("/state") + 1, M_XENBUS, M_WAITOK);
sprintf(statepath, "%s/state", ivars->xd_otherend_path);
free(ivars->xd_otherend_watch.node, M_XENBUS);
ivars->xd_otherend_watch.node = statepath;
- xs_register_watch(&ivars->xd_otherend_watch);
+ DEVICE_RESUME(kids[i]);
+
+ xs_register_watch(&ivars->xd_otherend_watch);
#if 0
/*
* Can't do this yet since we are running in
diff --git a/sys/xen/xenbus/xenbusb_back.c b/sys/xen/xenbus/xenbusb_back.c
index 1252abe..351140a 100644
--- a/sys/xen/xenbus/xenbusb_back.c
+++ b/sys/xen/xenbus/xenbusb_back.c
@@ -292,7 +292,7 @@ static device_method_t xenbusb_back_methods[] = {
DEVMETHOD(device_detach, bus_generic_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
+ DEVMETHOD(device_resume, xenbusb_resume),
/* Bus Interface */
DEVMETHOD(bus_print_child, xenbusb_print_child),
diff --git a/sys/xen/xenbus/xenbusb_front.c b/sys/xen/xenbus/xenbusb_front.c
index b4e470e..818e7f0 100644
--- a/sys/xen/xenbus/xenbusb_front.c
+++ b/sys/xen/xenbus/xenbusb_front.c
@@ -171,7 +171,7 @@ static device_method_t xenbusb_front_methods[] = {
DEVMETHOD(device_detach, bus_generic_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
- DEVMETHOD(device_resume, bus_generic_resume),
+ DEVMETHOD(device_resume, xenbusb_resume),
/* Bus Interface */
DEVMETHOD(bus_print_child, xenbusb_print_child),
diff --git a/sys/xen/xenstore/xenstore.c b/sys/xen/xenstore/xenstore.c
index ee1bb22..658e6e3 100644
--- a/sys/xen/xenstore/xenstore.c
+++ b/sys/xen/xenstore/xenstore.c
@@ -721,8 +721,8 @@ xs_reply_filter(uint32_t request_msg_type,
/*
* The count of transactions drops if we attempted
* to end a transaction (even if that attempt fails
- * in error), we receive a transaction end acknowledgement
- * or if our attempt to begin a transactionfails.
+ * in error), we receive a transaction end acknowledgement,
+ * or if our attempt to begin a transaction fails.
*/
if (request_msg_type == XS_TRANSACTION_END
|| (request_reply_error == 0 && reply_msg_type == XS_TRANSACTION_END)
@@ -1194,8 +1194,14 @@ xs_attach(device_t dev)
* all transactions and individual requests have completed.
*/
static int
-xs_suspend(device_t dev __unused)
+xs_suspend(device_t dev)
{
+ int error;
+
+ /* Suspend child Xen devices. */
+ error = bus_generic_suspend(dev);
+ if (error != 0)
+ return (error);
sx_xlock(&xs.suspend_mutex);
sx_xlock(&xs.request_mutex);
@@ -1227,6 +1233,9 @@ xs_resume(device_t dev __unused)
sx_xunlock(&xs.suspend_mutex);
+ /* Resume child Xen devices. */
+ bus_generic_resume(dev);
+
return (0);
}
OpenPOWER on IntegriCloud