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

Re: [Xen-devel] [PATCH] tools/misc/xencov.c: Use MAP_WIRED on NetBSD



On Wed, 2013-06-12 at 13:02 +0100, Frediano Ziglio wrote:
> Subject: [PATCH] gcov: Do not use mmap directly but use 
> xc_hypercall_buffer_alloc
> 
> xencov.c did not compile on NetBSD so use xc_hypercall_buffer which is
> more portable.
> 
> Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>

Looks good to me, thanks,

Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

George, what is your feeling for the release? This is a somewhat obscure
tool and IMHO the risk of regressing is small. The change fixes the
default build on NetBSD.

> ---
>  tools/misc/xencov.c |   22 +++++++++-------------
>  1 file changed, 9 insertions(+), 13 deletions(-)
> 
> Here you are. It get tested on a x64 machine, if somebody could test it
> with a NetBSD would be great.

That would certainly be useful and appreciated although since it
currently doesn't build on NetBSD there is not much chance of regressing
there so I'll probably apply (subject to George's approval) in a day or
so regardless (unless the test is done and fails of course).


> 
> diff --git a/tools/misc/xencov.c b/tools/misc/xencov.c
> index 6645a30..fb4b2ff 100644
> --- a/tools/misc/xencov.c
> +++ b/tools/misc/xencov.c
> @@ -24,7 +24,6 @@
>  #include <unistd.h>
>  #include <errno.h>
>  #include <err.h>
> -#include <sys/mman.h>
>  
>  static xc_interface *gcov_xch = NULL;
>  
> @@ -35,16 +34,17 @@ static void gcov_init(void)
>          err(1, "opening interface");
>  }
>  
> -int gcov_get_info(int op, struct xen_sysctl *sys, void *ptr)
> +int gcov_get_info(int op, struct xen_sysctl *sys, struct xc_hypercall_buffer 
> *ptr)
>  {
>      struct xen_sysctl_coverage_op *cov;
> +    DECLARE_HYPERCALL_BUFFER_ARGUMENT(ptr);
>  
>      memset(sys, 0, sizeof(*sys));
>      sys->cmd = XEN_SYSCTL_coverage_op;
>  
>      cov = &sys->u.coverage_op;
>      cov->cmd = op;
> -    cov->u.raw_info.p = ptr;
> +    set_xen_guest_handle(cov->u.raw_info, ptr);
>  
>      return xc_sysctl(gcov_xch, sys);
>  }
> @@ -52,10 +52,8 @@ int gcov_get_info(int op, struct xen_sysctl *sys, void 
> *ptr)
>  static void gcov_read(const char *fn, int reset)
>  {
>      struct xen_sysctl sys;
> -    unsigned page_size = sysconf(_SC_PAGESIZE);
>      uint32_t total_len;
> -    uint8_t *p;
> -    size_t size;
> +    DECLARE_HYPERCALL_BUFFER(uint8_t, p);
>      FILE *f;
>      int op = reset ? XEN_SYSCTL_COVERAGE_read_and_reset :
>                       XEN_SYSCTL_COVERAGE_read;
> @@ -71,16 +69,13 @@ static void gcov_read(const char *fn, int reset)
>          errx(1, "coverage size too big %u bytes\n", total_len);
>  
>      /* allocate */
> -    size = total_len + page_size;
> -    size -= (size % page_size);
> -    p = mmap(0, size, PROT_WRITE|PROT_READ,
> -             MAP_PRIVATE|MAP_ANON|MAP_LOCKED, -1, 0);
> -    if ( p == (uint8_t *) -1 )
> -        err(1, "mapping memory for coverage");
> +    p = xc_hypercall_buffer_alloc(gcov_xch, p, total_len);
> +    if ( p == NULL )
> +        err(1, "allocating memory for coverage");
>  
>      /* get data */
>      memset(p, 0, total_len);
> -    if ( gcov_get_info(op, &sys, p) < 0 )
> +    if ( gcov_get_info(op, &sys, HYPERCALL_BUFFER(p)) < 0 )
>          err(1, "getting coverage information");
>  
>      /* write to a file */
> @@ -94,6 +89,7 @@ static void gcov_read(const char *fn, int reset)
>          err(1, "writing coverage to file");
>      if (f != stdout)
>          fclose(f);
> +    xc_hypercall_buffer_free(gcov_xch, p);
>  }
>  
>  static void gcov_reset(void)



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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