diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -523,6 +523,7 @@ static int domain_create_ring(struct dom { int err, remote_port, ring_ref, rc; char *type, path[PATH_MAX]; + int rebind = 0; err = xs_gather(xs, dom->serialpath, "ring-ref", "%u", &ring_ref, @@ -548,8 +549,17 @@ static int domain_create_ring(struct dom } free(type); - if ((ring_ref == dom->ring_ref) && (remote_port == dom->remote_port)) - goto out; + if ((ring_ref == dom->ring_ref) && (remote_port == dom->remote_port)) { + xc_evtchn_status_t status = { + .dom = DOMID_SELF, + .port = dom->local_port }; + + if (xc_evtchn_status(xc, &status) + || status.status != EVTCHNSTAT_interdomain) + rebind = 1; + else + goto out; + } if (ring_ref != dom->ring_ref) { if (dom->interface != NULL) @@ -565,17 +575,19 @@ static int domain_create_ring(struct dom dom->ring_ref = ring_ref; } - dom->local_port = -1; - dom->remote_port = -1; - if (dom->xce_handle != -1) - xc_evtchn_close(dom->xce_handle); + if (!rebind) { + dom->local_port = -1; + dom->remote_port = -1; + if (dom->xce_handle != -1) + xc_evtchn_close(dom->xce_handle); - /* Opening evtchn independently for each console is a bit - * wasteful, but that's how the code is structured... */ - dom->xce_handle = xc_evtchn_open(); - if (dom->xce_handle == -1) { - err = errno; - goto out; + /* Opening evtchn independently for each console is a bit + * wasteful, but that's how the code is structured... */ + dom->xce_handle = xc_evtchn_open(); + if (dom->xce_handle == -1) { + err = errno; + goto out; + } } rc = xc_evtchn_bind_interdomain(dom->xce_handle,