aboutsummaryrefslogtreecommitdiff
path: root/hw/xen/xen-bus.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2019-02-04 12:57:26 +0000
committerPeter Maydell <peter.maydell@linaro.org>2019-02-04 12:57:26 +0000
commitf3b4d5ca67f2e933c93457b701883c307b99c15c (patch)
tree05d9e71f7f1a01369e820c5311f7b06242c135cc /hw/xen/xen-bus.c
parenta61faa3d02159d24d4fa984733dbc0c905508752 (diff)
parent3149f183d7ca448b1dc30fe3d4acb9e367de01bf (diff)
Merge remote-tracking branch 'remotes/aperard/tags/pull-xen-20190204' into staging
Xen queue * xen-block, the Xen PV backend, now handles resize. * configure cleanup. * xen-bus fix. # gpg: Signature made Mon 04 Feb 2019 11:16:13 GMT # gpg: using RSA key F80C006308E22CFD8A92E7980CF5572FD7FB55AF # gpg: issuer "anthony.perard@citrix.com" # gpg: Good signature from "Anthony PERARD <anthony.perard@gmail.com>" [marginal] # gpg: aka "Anthony PERARD <anthony.perard@citrix.com>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 5379 2F71 024C 600F 778A 7161 D8D5 7199 DF83 42C8 # Subkey fingerprint: F80C 0063 08E2 2CFD 8A92 E798 0CF5 572F D7FB 55AF * remotes/aperard/tags/pull-xen-20190204: xen-block: handle resize callback xen: fix xen-bus state model to allow frontend re-connection configure: Don't add Xen's libs to LDFLAGS configure: xen: Stop build-testing for xc_domain_create Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/xen/xen-bus.c')
-rw-r--r--hw/xen/xen-bus.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c
index 3aeccec69c..49a725e8c7 100644
--- a/hw/xen/xen-bus.c
+++ b/hw/xen/xen-bus.c
@@ -547,20 +547,15 @@ static void xen_device_backend_changed(void *opaque)
}
/*
- * If a backend is still 'online' then its state should be cycled
- * back round to InitWait in order for a new frontend instance to
- * connect. This may happen when, for example, a frontend driver is
- * re-installed or updated.
- * If a backend is not 'online' then the device should be destroyed.
+ * If a backend is still 'online' then we should leave it alone but,
+ * if a backend is not 'online', then the device should be destroyed
+ * once the state is Closed.
*/
- if (xendev->backend_online &&
- xendev->backend_state == XenbusStateClosed) {
- xen_device_backend_set_state(xendev, XenbusStateInitWait);
- } else if (!xendev->backend_online &&
- (xendev->backend_state == XenbusStateClosed ||
- xendev->backend_state == XenbusStateInitialising ||
- xendev->backend_state == XenbusStateInitWait ||
- xendev->backend_state == XenbusStateUnknown)) {
+ if (!xendev->backend_online &&
+ (xendev->backend_state == XenbusStateClosed ||
+ xendev->backend_state == XenbusStateInitialising ||
+ xendev->backend_state == XenbusStateInitWait ||
+ xendev->backend_state == XenbusStateUnknown)) {
Error *local_err = NULL;
if (!xen_backend_try_device_destroy(xendev, &local_err)) {
@@ -715,6 +710,17 @@ static void xen_device_frontend_changed(void *opaque)
xen_device_frontend_set_state(xendev, state);
+ if (state == XenbusStateInitialising &&
+ xendev->backend_state == XenbusStateClosed &&
+ xendev->backend_online) {
+ /*
+ * The frontend is re-initializing so switch back to
+ * InitWait.
+ */
+ xen_device_backend_set_state(xendev, XenbusStateInitWait);
+ return;
+ }
+
if (xendev_class->frontend_changed) {
Error *local_err = NULL;