This patch modifies the console daemon to use xc_gnttab_map_grant_ref
instead of xc_map_foreign_range where available.
TODO: This will probably break linking on Solaris, since they don't have
stubs for the gntmap functions yet.
A previous version of this patch was sent to xen-devel. See
http://lists.xensource.com/archives/html/xen-devel/2008-07/msg00610.html
Signed-off-by: Diego Ongaro <diego.ongaro@xxxxxxxxxx>
Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
---
diff -r 5c5e30d44696 tools/console/daemon/io.c
--- a/tools/console/daemon/io.c Fri Aug 01 16:50:29 2008 +0100
+++ b/tools/console/daemon/io.c Fri Aug 01 16:50:30 2008 +0100
@@ -25,6 +25,7 @@
#include <xs.h>
#include <xen/io/console.h>
#include <xenctrl.h>
+#include <xen/grant_table.h>
#include <stdlib.h>
#include <errno.h>
@@ -538,12 +539,22 @@
goto out;
if (ring_ref != dom->ring_ref) {
- if (dom->interface != NULL)
- munmap(dom->interface, getpagesize());
- dom->interface = xc_map_foreign_range(
- xc, dom->domid, getpagesize(),
- PROT_READ|PROT_WRITE,
- (unsigned long)ring_ref);
+ if (xcg >= 0) {
+ /* this is the preferred method */
+ if (dom->interface != NULL)
+ xc_gnttab_munmap(xcg, dom->interface, 1);
+ dom->interface = xc_gnttab_map_grant_ref(
+ xcg, dom->domid,
+ GNTTAB_RESERVED_CONSOLE,
+ PROT_READ|PROT_WRITE);
+ } else {
+ if (dom->interface != NULL)
+ munmap(dom->interface, getpagesize());
+ dom->interface = xc_map_foreign_range(
+ xc, dom->domid, getpagesize(),
+ PROT_READ|PROT_WRITE,
+ (unsigned long)ring_ref);
+ }
if (dom->interface == NULL) {
err = EINVAL;
goto out;
@@ -736,9 +747,13 @@
{
d->is_dead = true;
watch_domain(d, false);
- if (d->interface != NULL)
- munmap(d->interface, getpagesize());
- d->interface = NULL;
+ if (d->interface != NULL) {
+ if (xcg >= 0)
+ xc_gnttab_munmap(xcg, d->interface, 1);
+ else
+ munmap(d->interface, getpagesize());
+ d->interface = NULL;
+ }
if (d->xce_handle != -1)
xc_evtchn_close(d->xce_handle);
d->xce_handle = -1;
diff -r 5c5e30d44696 tools/console/daemon/utils.c
--- a/tools/console/daemon/utils.c Fri Aug 01 16:50:29 2008 +0100
+++ b/tools/console/daemon/utils.c Fri Aug 01 16:50:30 2008 +0100
@@ -38,7 +38,8 @@
#include "utils.h"
struct xs_handle *xs;
-int xc;
+int xc = -1;
+int xcg = -1;
static void child_exit(int sig)
{
@@ -122,6 +123,11 @@
goto out;
}
+ xcg = xc_gnttab_open();
+ if (xcg == -1) {
+ dolog(LOG_WARNING, "Failed to open gnttab (%m)");
+ }
+
if (!xs_watch(xs, "@introduceDomain", "domlist")) {
dolog(LOG_ERR, "xenstore watch on @introduceDomain fails.");
goto out;
@@ -139,6 +145,8 @@
xs_daemon_close(xs);
if (xc != -1)
xc_interface_close(xc);
+ if (xcg != -1)
+ xc_gnttab_close(xcg);
return false;
}
diff -r 5c5e30d44696 tools/console/daemon/utils.h
--- a/tools/console/daemon/utils.h Fri Aug 01 16:50:29 2008 +0100
+++ b/tools/console/daemon/utils.h Fri Aug 01 16:50:30 2008 +0100
@@ -32,6 +32,7 @@
extern struct xs_handle *xs;
extern int xc;
+extern int xcg;
#if 1
#define dolog(val, fmt, ...) do { \
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|