[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 5/24] [xen-unstable.hg] make consoled use grantref rather than map_foreign_range (which only privileged domains can do)





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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.