From mboxrd@z Thu Jan 1 00:00:00 1970 From: Diego Ongaro Subject: [PATCH RFC 2/5] Grant table for console, xenstore pages Date: Fri, 11 Jul 2008 20:15:13 +0100 Message-ID: <4877B141.4060500@citrix.com> References: <4877B09E.5000909@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <4877B09E.5000909@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This patch modifies the xenstore daemon to use xc_gnttab_map_grant_ref instead of xc_map_foreign_range. Make sure you have linux-2.6.18-xen.hg changeset 600:1bd3dbfdaf0f before running this. Signed-off-by: Diego Ongaro --- diff -r e4e473425d0f tools/xenstore/xenstored_domain.c --- a/tools/xenstore/xenstored_domain.c Thu Jul 10 19:05:56 2008 +0100 +++ b/tools/xenstore/xenstored_domain.c Thu Jul 10 19:30:50 2008 +0100 @@ -31,8 +31,10 @@ #include "xenstored_watch.h" #include +#include static int *xc_handle; +static int *xcg_handle; static evtchn_port_t virq_port; int xce_handle = -1; @@ -343,13 +345,14 @@ domain = find_domain_by_domid(domid); if (domain == NULL) { - interface = xc_map_foreign_range( - *xc_handle, domid, - getpagesize(), PROT_READ|PROT_WRITE, mfn); + interface = xc_gnttab_map_grant_ref(*xcg_handle, domid, + GNTTAB_RESERVED_XENSTORE, + PROT_READ|PROT_WRITE); if (!interface) { send_error(conn, errno); return; } + /* Hang domain off "in" until we're finished. */ domain = new_domain(in, domid, port); if (!domain) { @@ -542,6 +545,12 @@ return 0; } +static int close_xcg_handle(void *_handle) +{ + xc_gnttab_close(*(int *)_handle); + return 0; +} + /* Returns the implicit path of a connection (only domains have this) */ const char *get_implicit_path(const struct connection *conn) { @@ -593,6 +602,16 @@ barf_perror("Failed to open connection to hypervisor"); talloc_set_destructor(xc_handle, close_xc_handle); + + xcg_handle = talloc(talloc_autofree_context(), int); + if (!xcg_handle) + barf_perror("Failed to allocate domain gnttab handle"); + + *xcg_handle = xc_gnttab_open(); + if (*xcg_handle < 0) + barf_perror("Failed to open gnttab connection to hypervisor"); + + talloc_set_destructor(xcg_handle, close_xcg_handle); xce_handle = xc_evtchn_open();