xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/2] xenconsoled: use grant references instead of map_foreign_range
@ 2013-01-10 17:28 Daniel De Graaf
  2013-01-10 17:28 ` [PATCH 2/2] libxl: correct xenstore permissions on console device Daniel De Graaf
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Daniel De Graaf @ 2013-01-10 17:28 UTC (permalink / raw)
  To: xen-devel; +Cc: Daniel De Graaf, Ian Jackson, Ian Campbell, Stefano Stabellini

Grant references for the xenstore and xenconsole shared pages exist, but
currently only xenstore uses these references.  Change the xenconsole
daemon to prefer using the grant reference over map_foreign_range when
mapping the shared console ring.

This allows xenconsoled to be run in a domain other than dom0 if set up
correctly - for libxl, the xenstore path /tool/xenconsoled/domid
specifies the domain containing xenconsoled.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: Ian Campbell <ian.campbell@citrix.com>
---
 tools/console/daemon/io.c   | 48 ++++++++++++++++++++++++++++++++++++++-------
 tools/console/daemon/io.h   |  1 -
 tools/console/daemon/main.c |  2 --
 3 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index 48fe151..e1720b6 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -24,6 +24,7 @@
 #include "io.h"
 #include <xenstore.h>
 #include <xen/io/console.h>
+#include <xen/grant_table.h>
 
 #include <stdlib.h>
 #include <errno.h>
@@ -69,6 +70,7 @@ static int log_hv_fd = -1;
 static evtchn_port_or_error_t log_hv_evtchn = -1;
 static xc_interface *xch; /* why does xenconsoled have two xc handles ? */
 static xc_evtchn *xce_handle = NULL;
+static xc_gnttab *xcg_handle = NULL;
 
 struct buffer {
 	char *data;
@@ -501,6 +503,18 @@ static int xs_gather(struct xs_handle *xs, const char *dir, ...)
 	va_end(ap);
 	return ret;
 }
+
+static void domain_unmap_interface(struct domain *dom)
+{
+	if (dom->interface == NULL)
+		return;
+	if (xcg_handle && dom->ring_ref == -1)
+		xc_gnttab_munmap(xcg_handle, dom->interface, 1);
+	else
+		munmap(dom->interface, getpagesize());
+	dom->interface = NULL;
+	dom->ring_ref = -1;
+}
  
 static int domain_create_ring(struct domain *dom)
 {
@@ -522,9 +536,19 @@ static int domain_create_ring(struct domain *dom)
 	}
 	free(type);
 
-	if (ring_ref != dom->ring_ref) {
-		if (dom->interface != NULL)
-			munmap(dom->interface, getpagesize());
+	/* If using ring_ref and it has changed, remap */
+	if (ring_ref != dom->ring_ref && dom->ring_ref != -1)
+		domain_unmap_interface(dom);
+
+	if (!dom->interface && xcg_handle) {
+		/* Prefer using grant table */
+		dom->interface = xc_gnttab_map_grant_ref(xcg_handle,
+			dom->domid, GNTTAB_RESERVED_CONSOLE,
+			PROT_READ|PROT_WRITE);
+		dom->ring_ref = -1;
+	}
+	if (!dom->interface) {
+		/* Fall back to xc_map_foreign_range */
 		dom->interface = xc_map_foreign_range(
 			xc, dom->domid, getpagesize(),
 			PROT_READ|PROT_WRITE,
@@ -720,9 +744,7 @@ static void shutdown_domain(struct domain *d)
 {
 	d->is_dead = true;
 	watch_domain(d, false);
-	if (d->interface != NULL)
-		munmap(d->interface, getpagesize());
-	d->interface = NULL;
+	domain_unmap_interface(d);
 	if (d->xce_handle != NULL)
 		xc_evtchn_close(d->xce_handle);
 	d->xce_handle = NULL;
@@ -730,7 +752,7 @@ static void shutdown_domain(struct domain *d)
 
 static unsigned enum_pass = 0;
 
-void enum_domains(void)
+static void enum_domains(void)
 {
 	int domid = 1;
 	xc_dominfo_t dominfo;
@@ -957,6 +979,14 @@ void handle_io(void)
 		}
 	}
 
+	xcg_handle = xc_gnttab_open(NULL, 0);
+	if (xcg_handle == NULL) {
+		dolog(LOG_DEBUG, "Failed to open xcg handle: %d (%s)",
+		      errno, strerror(errno));
+	}
+
+	enum_domains();
+
 	for (;;) {
 		struct domain *d, *n;
 		int max_fd = -1;
@@ -1097,6 +1127,10 @@ void handle_io(void)
 		xc_evtchn_close(xce_handle);
 		xce_handle = NULL;
 	}
+	if (xcg_handle != NULL) {
+		xc_gnttab_close(xcg_handle);
+		xcg_handle = NULL;
+	}
 	log_hv_evtchn = -1;
 }
 
diff --git a/tools/console/daemon/io.h b/tools/console/daemon/io.h
index 8fa04b6..f658bfc 100644
--- a/tools/console/daemon/io.h
+++ b/tools/console/daemon/io.h
@@ -21,7 +21,6 @@
 #ifndef CONSOLED_IO_H
 #define CONSOLED_IO_H
 
-void enum_domains(void);
 void handle_io(void);
 
 #endif
diff --git a/tools/console/daemon/main.c b/tools/console/daemon/main.c
index 789baa6..92d2fc4 100644
--- a/tools/console/daemon/main.c
+++ b/tools/console/daemon/main.c
@@ -161,8 +161,6 @@ int main(int argc, char **argv)
 	if (!xen_setup())
 		exit(1);
 
-	enum_domains();
-
 	handle_io();
 
 	closelog();
-- 
1.7.11.7

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

end of thread, other threads:[~2013-01-17 17:42 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-10 17:28 [PATCH v2 1/2] xenconsoled: use grant references instead of map_foreign_range Daniel De Graaf
2013-01-10 17:28 ` [PATCH 2/2] libxl: correct xenstore permissions on console device Daniel De Graaf
2013-01-11 19:08 ` [PATCH v2 1/2] xenconsoled: use grant references instead of map_foreign_range Stefano Stabellini
2013-01-11 19:21   ` Daniel De Graaf
2013-01-14 16:23     ` Stefano Stabellini
2013-01-17 16:50 ` Ian Campbell
2013-01-17 16:50 ` Ian Campbell
2013-01-17 16:58   ` Daniel De Graaf
2013-01-17 17:05     ` Ian Campbell
2013-01-17 17:15       ` Daniel De Graaf
2013-01-17 17:42         ` Ian Campbell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).