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

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



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


 


Rackspace

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