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

Re: [Xen-API] [Xen-devel] [PATCH 4 of 5 v3] tools/ocaml: libxc bindings: Fix stub_xc_readconsolering()



Hi,

This looks fine to me. I assume the console ring is a C string which doesn't 
contain NULLs in the middle and hence it's sensible to use "caml_copy_string" 
(the alternative would be to treat it as a raw block of bytes using 
"caml_alloc_string" and memcpy-- OCaml strings can contain NULLs safely)

Cheers,
Dave

> -----Original Message-----
> From: xen-devel-bounces@xxxxxxxxxxxxx [mailto:xen-devel-
> bounces@xxxxxxxxxxxxx] On Behalf Of Andrew Cooper
> Sent: 12 March 2013 6:09 PM
> To: xen-devel@xxxxxxxxxxxxx
> Cc: Ian Jackson; Keir (Xen.org); Ian Campbell; Jan Beulich; xen-
> api@xxxxxxxxxxxxx
> Subject: [Xen-devel] [PATCH 4 of 5 v3] tools/ocaml: libxc bindings: Fix
> stub_xc_readconsolering()
> 
> There are two problems with this function:
>   * The caml_{enter,leave}_blocking_section() calls mean that two threads
> can
>     compete for use of the static ring[] buffer.
>   * It fails to retrieve the entire buffer if the hypervisor has used 32K or
>     more of its console ring.
> 
> Rewrite the function using the new xc_consoleringsize() and
> xc_readconsolering_buffer() functions to efficiently grab the entire console
> ring.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> 
> --
> Changes since v2:
>  * Tweak style and remove redundant variables Changes since v1:
>  * Convert conring_size to being static to avoid needless hypercalls
>  * Fix memory due to ordering of failwith_xc() and
> xc_hypercall_buffer_free()
>  * Remove useless CAMLreturns()
> 
> diff -r c7b82dfbec34 -r 7a33b4fdb977 tools/ocaml/libs/xc/xenctrl_stubs.c
> --- a/tools/ocaml/libs/xc/xenctrl_stubs.c
> +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
> @@ -523,27 +523,47 @@ CAMLprim value stub_xc_evtchn_reset(valu
>       CAMLreturn(Val_unit);
>  }
> 
> -
> -#define RING_SIZE 32768
> -static char ring[RING_SIZE];
> -
>  CAMLprim value stub_xc_readconsolering(value xch)  {
> -     unsigned int size = RING_SIZE - 1;
> -     char *ring_ptr = ring;
> +     static uint64_t conring_size = 0;
> +     unsigned int nr_chars;
> +     DECLARE_HYPERCALL_BUFFER(char, ring);
>       int retval;
> 
>       CAMLparam1(xch);
> +     CAMLlocal1(conring);
> +
> +     if (!conring_size)
> +     {
> +             if (xc_consoleringsize(_H(xch), &conring_size))
> +                     failwith_xc(_H(xch));
> +
> +             /* Round conring_size up to the next page, for NULL
> terminator
> +                and slop from a race with printk() in the hypervisor. */
> +             conring_size = (conring_size + XC_PAGE_SIZE) &
> XC_PAGE_MASK;
> +     }
> +
> +     nr_chars = conring_size - 1;
> +     ring = xc_hypercall_buffer_alloc(_H(xch), ring, conring_size);
> +
> +     if (!ring)
> +             caml_raise_out_of_memory();
> 
>       caml_enter_blocking_section();
> -     retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
> +     retval = xc_readconsolering_buffer(_H(xch),
> HYPERCALL_BUFFER(ring),
> +                                        &nr_chars, 0, 0, NULL);
>       caml_leave_blocking_section();
> 
>       if (retval)
> +     {
> +             xc_hypercall_buffer_free(_H(xch), ring);
>               failwith_xc(_H(xch));
> +     }
> 
> -     ring[size] = '\0';
> -     CAMLreturn(caml_copy_string(ring));
> +     ring[nr_chars] = '\0';
> +     conring = caml_copy_string(ring);
> +     xc_hypercall_buffer_free(_H(xch), ring);
> +     CAMLreturn(conring);
>  }
> 
>  CAMLprim value stub_xc_send_debug_keys(value xch, value keys)
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel

_______________________________________________
Xen-api mailing list
Xen-api@xxxxxxxxxxxxx
http://lists.xen.org/cgi-bin/mailman/listinfo/xen-api


 


Rackspace

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