WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH 01 of 25] libxc: some xc_gnttab_* functions are n

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 01 of 25] libxc: some xc_gnttab_* functions are not Linux specific
From: Christoph Egger <Christoph.Egger@xxxxxxx>
Date: Wed, 22 Dec 2010 15:34:13 +0100
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Wed, 22 Dec 2010 06:35:26 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <7c6e87f167d47b2c0b85.1291370225@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <7c6e87f167d47b2c0b85.1291370225@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: KMail/1.9.10
Successfully tested with NetBSD.
Acked-by: Christoph Egger <Christoph.Egger@xxxxxxx>

On Friday 03 December 2010 10:57:05 Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1291369006 0
> # Node ID 7c6e87f167d47b2c0b850806d0e9fa298018ebd4
> # Parent  9a40ab7a4347e4c49785d079a598a1bc22477739
> libxc: some xc_gnttab_* functions are not Linux specific
>
> They simply make hypercalls and perform other operations via the
> abstract interface. Create xc_gnttab.c and move those functions there.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/Makefile
> --- a/tools/libxc/Makefile      Fri Dec 03 09:36:46 2010 +0000
> +++ b/tools/libxc/Makefile      Fri Dec 03 09:36:46 2010 +0000
> @@ -11,6 +11,7 @@ CTRL_SRCS-y       += xc_cpupool.c
>  CTRL_SRCS-y       += xc_cpupool.c
>  CTRL_SRCS-y       += xc_domain.c
>  CTRL_SRCS-y       += xc_evtchn.c
> +CTRL_SRCS-y       += xc_gnttab.c
>  CTRL_SRCS-y       += xc_misc.c
>  CTRL_SRCS-y       += xc_acm.c
>  CTRL_SRCS-y       += xc_flask.c
> diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_gnttab.c
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxc/xc_gnttab.c   Fri Dec 03 09:36:46 2010 +0000
> @@ -0,0 +1,147 @@
> +/*************************************************************************
>***** + *
> + * Copyright (c) 2007-2008, D G Murray <Derek.Murray@xxxxxxxxxxxx>
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation;
> + * version 2.1 of the License.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
> 02110-1301  USA + */
> +
> +#include "xc_private.h"
> +
> +int xc_gnttab_op(xc_interface *xch, int cmd, void * op, int op_size, int
> count) +{
> +    int ret = 0;
> +    DECLARE_HYPERCALL;
> +    DECLARE_HYPERCALL_BOUNCE(op, count * op_size,
> XC_HYPERCALL_BUFFER_BOUNCE_BOTH); +
> +    if ( xc_hypercall_bounce_pre(xch, op) )
> +    {
> +        PERROR("Could not bounce buffer for grant table op hypercall");
> +        goto out1;
> +    }
> +
> +    hypercall.op = __HYPERVISOR_grant_table_op;
> +    hypercall.arg[0] = cmd;
> +    hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(op);
> +    hypercall.arg[2] = count;
> +
> +    ret = do_xen_hypercall(xch, &hypercall);
> +
> +    xc_hypercall_bounce_post(xch, op);
> +
> + out1:
> +    return ret;
> +}
> +
> +int xc_gnttab_get_version(xc_interface *xch, int domid)
> +{
> +    struct gnttab_get_version query;
> +    int rc;
> +
> +    query.dom = domid;
> +    rc = xc_gnttab_op(xch, GNTTABOP_get_version, &query, sizeof(query),
> +                      1);
> +    if ( rc < 0 )
> +        return rc;
> +    else
> +        return query.version;
> +}
> +
> +static void *_gnttab_map_table(xc_interface *xch, int domid, int *gnt_num)
> +{
> +    int rc, i;
> +    struct gnttab_query_size query;
> +    struct gnttab_setup_table setup;
> +    DECLARE_HYPERCALL_BUFFER(unsigned long, frame_list);
> +    xen_pfn_t *pfn_list = NULL;
> +    grant_entry_v1_t *gnt = NULL;
> +
> +    if ( !gnt_num )
> +        return NULL;
> +
> +    query.dom = domid;
> +    rc = xc_gnttab_op(xch, GNTTABOP_query_size, &query, sizeof(query), 1);
> +
> +    if ( rc || (query.status != GNTST_okay) )
> +    {
> +        ERROR("Could not query dom's grant size\n", domid);
> +        return NULL;
> +    }
> +
> +    *gnt_num = query.nr_frames * (PAGE_SIZE / sizeof(grant_entry_v1_t) );
> +
> +    frame_list = xc_hypercall_buffer_alloc(xch, frame_list,
> query.nr_frames * sizeof(unsigned long)); +    if ( !frame_list )
> +    {
> +        ERROR("Could not allocate frame_list in xc_gnttab_map_table\n");
> +        return NULL;
> +    }
> +
> +    pfn_list = malloc(query.nr_frames * sizeof(xen_pfn_t));
> +    if ( !pfn_list )
> +    {
> +        ERROR("Could not allocate pfn_list in xc_gnttab_map_table\n");
> +        goto err;
> +    }
> +
> +    setup.dom = domid;
> +    setup.nr_frames = query.nr_frames;
> +    set_xen_guest_handle(setup.frame_list, frame_list);
> +
> +    /* XXX Any race with other setup_table hypercall? */
> +    rc = xc_gnttab_op(xch, GNTTABOP_setup_table, &setup, sizeof(setup),
> +                      1);
> +
> +    if ( rc || (setup.status != GNTST_okay) )
> +    {
> +        ERROR("Could not get grant table frame list\n");
> +        goto err;
> +    }
> +
> +    for ( i = 0; i < setup.nr_frames; i++ )
> +        pfn_list[i] = frame_list[i];
> +
> +    gnt = xc_map_foreign_pages(xch, domid, PROT_READ, pfn_list,
> +                               setup.nr_frames);
> +    if ( !gnt )
> +    {
> +        ERROR("Could not map grant table\n");
> +        goto err;
> +    }
> +
> +err:
> +    if ( frame_list )
> +        xc_hypercall_buffer_free(xch, frame_list);
> +    if ( pfn_list )
> +        free(pfn_list);
> +
> +    return gnt;
> +}
> +
> +grant_entry_v1_t *xc_gnttab_map_table_v1(xc_interface *xch, int domid,
> +                                         int *gnt_num)
> +{
> +    if (xc_gnttab_get_version(xch, domid) == 2)
> +        return NULL;
> +    return _gnttab_map_table(xch, domid, gnt_num);
> +}
> +
> +grant_entry_v2_t *xc_gnttab_map_table_v2(xc_interface *xch, int domid,
> +                                         int *gnt_num)
> +{
> +    if (xc_gnttab_get_version(xch, domid) != 2)
> +        return NULL;
> +    return _gnttab_map_table(xch, domid, gnt_num);
> +}
> +
> diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_linux.c
> --- a/tools/libxc/xc_linux.c    Fri Dec 03 09:36:46 2010 +0000
> +++ b/tools/libxc/xc_linux.c    Fri Dec 03 09:36:46 2010 +0000
> @@ -608,132 +608,6 @@ int xc_gnttab_set_max_grants(xc_interfac
>      return 0;
>  }
>
> -int xc_gnttab_op(xc_interface *xch, int cmd, void * op, int op_size, int
> count) -{
> -    int ret = 0;
> -    DECLARE_HYPERCALL;
> -    DECLARE_HYPERCALL_BOUNCE(op, count * op_size,
> XC_HYPERCALL_BUFFER_BOUNCE_BOTH); -
> -    if ( xc_hypercall_bounce_pre(xch, op) )
> -    {
> -        PERROR("Could not bounce buffer for grant table op hypercall");
> -        goto out1;
> -    }
> -
> -    hypercall.op = __HYPERVISOR_grant_table_op;
> -    hypercall.arg[0] = cmd;
> -    hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(op);
> -    hypercall.arg[2] = count;
> -
> -    ret = do_xen_hypercall(xch, &hypercall);
> -
> -    xc_hypercall_bounce_post(xch, op);
> -
> - out1:
> -    return ret;
> -}
> -
> -int xc_gnttab_get_version(xc_interface *xch, int domid)
> -{
> -    struct gnttab_get_version query;
> -    int rc;
> -
> -    query.dom = domid;
> -    rc = xc_gnttab_op(xch, GNTTABOP_get_version, &query, sizeof(query),
> -                      1);
> -    if ( rc < 0 )
> -        return rc;
> -    else
> -        return query.version;
> -}
> -
> -static void *_gnttab_map_table(xc_interface *xch, int domid, int *gnt_num)
> -{
> -    int rc, i;
> -    struct gnttab_query_size query;
> -    struct gnttab_setup_table setup;
> -    DECLARE_HYPERCALL_BUFFER(unsigned long, frame_list);
> -    xen_pfn_t *pfn_list = NULL;
> -    grant_entry_v1_t *gnt = NULL;
> -
> -    if ( !gnt_num )
> -        return NULL;
> -
> -    query.dom = domid;
> -    rc = xc_gnttab_op(xch, GNTTABOP_query_size, &query, sizeof(query), 1);
> -
> -    if ( rc || (query.status != GNTST_okay) )
> -    {
> -        ERROR("Could not query dom's grant size\n", domid);
> -        return NULL;
> -    }
> -
> -    *gnt_num = query.nr_frames * (PAGE_SIZE / sizeof(grant_entry_v1_t) );
> -
> -    frame_list = xc_hypercall_buffer_alloc(xch, frame_list,
> query.nr_frames * sizeof(unsigned long)); -    if ( !frame_list )
> -    {
> -        ERROR("Could not allocate frame_list in xc_gnttab_map_table\n");
> -        return NULL;
> -    }
> -
> -    pfn_list = malloc(query.nr_frames * sizeof(xen_pfn_t));
> -    if ( !pfn_list )
> -    {
> -        ERROR("Could not allocate pfn_list in xc_gnttab_map_table\n");
> -        goto err;
> -    }
> -
> -    setup.dom = domid;
> -    setup.nr_frames = query.nr_frames;
> -    set_xen_guest_handle(setup.frame_list, frame_list);
> -
> -    /* XXX Any race with other setup_table hypercall? */
> -    rc = xc_gnttab_op(xch, GNTTABOP_setup_table, &setup, sizeof(setup),
> -                      1);
> -
> -    if ( rc || (setup.status != GNTST_okay) )
> -    {
> -        ERROR("Could not get grant table frame list\n");
> -        goto err;
> -    }
> -
> -    for ( i = 0; i < setup.nr_frames; i++ )
> -        pfn_list[i] = frame_list[i];
> -
> -    gnt = xc_map_foreign_pages(xch, domid, PROT_READ, pfn_list,
> -                               setup.nr_frames);
> -    if ( !gnt )
> -    {
> -        ERROR("Could not map grant table\n");
> -        goto err;
> -    }
> -
> -err:
> -    if ( frame_list )
> -        xc_hypercall_buffer_free(xch, frame_list);
> -    if ( pfn_list )
> -        free(pfn_list);
> -
> -    return gnt;
> -}
> -
> -grant_entry_v1_t *xc_gnttab_map_table_v1(xc_interface *xch, int domid,
> -                                         int *gnt_num)
> -{
> -    if (xc_gnttab_get_version(xch, domid) == 2)
> -        return NULL;
> -    return _gnttab_map_table(xch, domid, gnt_num);
> -}
> -
> -grant_entry_v2_t *xc_gnttab_map_table_v2(xc_interface *xch, int domid,
> -                                         int *gnt_num)
> -{
> -    if (xc_gnttab_get_version(xch, domid) != 2)
> -        return NULL;
> -    return _gnttab_map_table(xch, domid, gnt_num);
> -}
> -
>  /*
>   * Local variables:
>   * mode: C
> diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_minios.c
> --- a/tools/libxc/xc_minios.c   Fri Dec 03 09:36:46 2010 +0000
> +++ b/tools/libxc/xc_minios.c   Fri Dec 03 09:36:46 2010 +0000
> @@ -457,18 +457,6 @@ int xc_gnttab_set_max_grants(xc_interfac
>      return ret;
>  }
>
> -grant_entry_v1_t *xc_gnttab_map_table_v1(
> -    xc_interface *xch, int domid, int *gnt_num)
> -{
> -    return NULL;
> -}
> -
> -grant_entry_v2_t *xc_gnttab_map_table_v2(
> -    xc_interface *xch, int domid, int *gnt_num)
> -{
> -    return NULL;
> -}
> -
>  /*
>   * Local variables:
>   * mode: C
> diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_netbsd.c
> --- a/tools/libxc/xc_netbsd.c   Fri Dec 03 09:36:46 2010 +0000
> +++ b/tools/libxc/xc_netbsd.c   Fri Dec 03 09:36:46 2010 +0000
> @@ -287,18 +287,6 @@ void discard_file_cache(xc_interface *xc
>      }
>  }
>
> -grant_entry_v1_t *xc_gnttab_map_table_v1(
> -    xc_interface *xch, int domid, int *gnt_num)
> -{
> -    return NULL;
> -}
> -
> -grant_entry_v2_t *xc_gnttab_map_table_v2(
> -    xc_interface *xch, int domid, int *gnt_num)
> -{
> -    return NULL;
> -}
> -
>  /*
>   * Local variables:
>   * mode: C
> diff -r 9a40ab7a4347 -r 7c6e87f167d4 tools/libxc/xc_solaris.c
> --- a/tools/libxc/xc_solaris.c  Fri Dec 03 09:36:46 2010 +0000
> +++ b/tools/libxc/xc_solaris.c  Fri Dec 03 09:36:46 2010 +0000
> @@ -261,15 +261,3 @@ void discard_file_cache(xc_interface *xc
>  {
>      // TODO: Implement for Solaris!
>  }
> -
> -grant_entry_v1_t *xc_gnttab_map_table_v1(
> -    xc_interface *xch, int domid, int *gnt_num)
> -{
> -    return NULL;
> -}
> -
> -grant_entry_v2_t *xc_gnttab_map_table_v2(
> -    xc_interface *xch, int domid, int *gnt_num)
> -{
> -    return NULL;
> -}
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


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