diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index 51e52e175892..dc046d25789e 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -939,6 +939,7 @@ static int __init xenbus_init(void) { int err; uint64_t v = 0; + bool wait = false; xen_store_domain_type = XS_UNKNOWN; if (!xen_domain()) @@ -992,17 +993,7 @@ static int __init xenbus_init(void) goto out_error; } if (v == ~0ULL) { - err = bind_evtchn_to_irqhandler(xen_store_evtchn, - xenbus_late_init, - 0, "xenstore_late_init", - &xb_waitq); - if (err < 0) { - pr_err("xenstore_late_init couldn't bind irq err=%d\n", - err); - return err; - } - - xs_init_irq = err; + wait = true; } else { /* Avoid truncation on 32-bit. */ #if BITS_PER_LONG == 32 @@ -1017,6 +1008,21 @@ static int __init xenbus_init(void) xen_store_interface = xen_remap(xen_store_gfn << XEN_PAGE_SHIFT, XEN_PAGE_SIZE); + if (xen_store_interface->connection != 0) + wait = true; + } + if (wait) { + err = bind_evtchn_to_irqhandler(xen_store_evtchn, + xenbus_late_init, + 0, "xenstore_late_init", + &xb_waitq); + if (err < 0) { + pr_err("xenstore_late_init couldn't bind irq err=%d\n", + err); + return err; + } + + xs_init_irq = err; } break; default: diff --git a/include/xen/interface/io/xs_wire.h b/include/xen/interface/io/xs_wire.h index d40a44f09b16..cd7ae5ebb133 100644 --- a/include/xen/interface/io/xs_wire.h +++ b/include/xen/interface/io/xs_wire.h @@ -87,6 +87,9 @@ struct xenstore_domain_interface { char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */ XENSTORE_RING_IDX req_cons, req_prod; XENSTORE_RING_IDX rsp_cons, rsp_prod; + uint32_t server_features; /* Bitmap of features supported by the server */ + uint32_t connection; + uint32_t error; }; /* Violating this is very bad. See docs/misc/xenstore.txt. */