All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Fix xenconsole after aborted save
@ 2009-04-20 13:23 Jiri Denemark
  2009-04-20 13:38 ` Gerd Hoffmann
  0 siblings, 1 reply; 11+ messages in thread
From: Jiri Denemark @ 2009-04-20 13:23 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 403 bytes --]

Hi.

When a domain is resumed after aborted save (e.g., because of insufficient
space on a device where the domain is being saved), xm console cannot
send/read any data. The reason is that the event channel used by xenconsole
stays unbound.

This patch modifies xenconsoled to check current status of open event channels
and rebind them if necessary.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

[-- Attachment #2: console-evtchn-rebind.patch --]
[-- Type: text/plain, Size: 1737 bytes --]

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,

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2009-04-22 16:15 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-20 13:23 [PATCH] Fix xenconsole after aborted save Jiri Denemark
2009-04-20 13:38 ` Gerd Hoffmann
2009-04-20 14:04   ` Jiri Denemark
2009-04-20 14:09     ` Gerd Hoffmann
2009-04-20 14:41     ` Keir Fraser
2009-04-20 15:58       ` Jiri Denemark
2009-04-22  9:49       ` Chris Lalancette
2009-04-22 10:22         ` Keir Fraser
2009-04-22 12:41           ` John Levon
2009-04-22 14:24           ` Chris Lalancette
2009-04-22 16:15           ` Neil Turton

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.