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

Re: [Xen-devel] [PATCH v1 2/5] libxl: add vsnd list and info



On Wed, Nov 01, 2017 at 05:04:44PM +0200, Oleksandr Grytsov wrote:
> From: Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx>
> 
> Add getting vsnd list amd info API
> 
> Signed-off-by: Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx>
> ---
>  tools/libxl/libxl.h         |  10 ++
>  tools/libxl/libxl_types.idl |  19 +++
>  tools/libxl/libxl_utils.h   |   3 +
>  tools/libxl/libxl_vsnd.c    | 375 
> +++++++++++++++++++++++++++++++++++++++++++-
>  4 files changed, 404 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> index 7200d49..acb73ce 100644
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -1927,6 +1927,16 @@ int libxl_device_vsnd_destroy(libxl_ctx *ctx, uint32_t 
> domid,
>                                const libxl_asyncop_how *ao_how)
>                                LIBXL_EXTERNAL_CALLERS_ONLY;
>  
> +libxl_device_vsnd *libxl_device_vsnd_list(libxl_ctx *ctx,
> +                                          uint32_t domid, int *num)
> +                                          LIBXL_EXTERNAL_CALLERS_ONLY;
> +void libxl_device_vsnd_list_free(libxl_device_vsnd* list, int num)
> +                                 LIBXL_EXTERNAL_CALLERS_ONLY;
> +int libxl_device_vsnd_getinfo(libxl_ctx *ctx, uint32_t domid,
> +                              libxl_device_vsnd *vsnd,
> +                              libxl_vsndinfo *vsndlinfo)
> +                              LIBXL_EXTERNAL_CALLERS_ONLY;
> +
>  /* Keyboard */
>  int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb 
> *vkb,
>                           const libxl_asyncop_how *ao_how)
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index aa30196..553e724 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -988,6 +988,25 @@ libxl_vdisplinfo = Struct("vdisplinfo", [
>      ("connectors", Array(libxl_connectorinfo, "num_connectors"))
>      ], dir=DIR_OUT)
>  
> +libxl_streaminfo = Struct("streaminfo", [
> +    ("req_evtch", integer),
> +    ("req_rref", integer)
> +    ])
> +
> +libxl_pcminfo = Struct("pcminfo", [
> +    ("streams", Array(libxl_streaminfo, "num_vsnd_streams"))
> +    ])
> +
> +libxl_vsndinfo = Struct("vsndinfo", [
> +    ("backend", string),
> +    ("backend_id", uint32),
> +    ("frontend", string),
> +    ("frontend_id", uint32),
> +    ("devid", libxl_devid),
> +    ("state", integer),
> +    ("pcms", Array(libxl_pcminfo, "num_vsnd_pcms"))
> +    ])
> +
>  # NUMA node characteristics: size and free are how much memory it has, and 
> how
>  # much of it is free, respectively. dists is an array of distances from this
>  # node to each other node.
> diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h
> index 9e743dc..5455752 100644
> --- a/tools/libxl/libxl_utils.h
> +++ b/tools/libxl/libxl_utils.h
> @@ -82,6 +82,9 @@ int libxl_devid_to_device_usbctrl(libxl_ctx *ctx, uint32_t 
> domid,
>  int libxl_devid_to_device_vdispl(libxl_ctx *ctx, uint32_t domid,
>                                   int devid, libxl_device_vdispl *vdispl);
>  
> +int libxl_devid_to_device_vsnd(libxl_ctx *ctx, uint32_t domid,
> +                               int devid, libxl_device_vsnd *vsnd);
> +
>  int libxl_ctrlport_to_device_usbdev(libxl_ctx *ctx, uint32_t domid,
>                                      int ctrl, int port,
>                                      libxl_device_usbdev *usbdev);
> diff --git a/tools/libxl/libxl_vsnd.c b/tools/libxl/libxl_vsnd.c
> index 99e4be3..35f1aed 100644
> --- a/tools/libxl/libxl_vsnd.c
> +++ b/tools/libxl/libxl_vsnd.c
> @@ -37,22 +37,247 @@ static int libxl__device_from_vsnd(libxl__gc *gc, 
> uint32_t domid,
>     return 0;
>  }
>  
> +static int libxl__sample_rates_from_string(libxl__gc *gc, const char *str,
> +                                           libxl_vsnd_params *params)
> +{
> +    char *tmp = libxl__strdup(gc, str);
> +
> +    params->num_sample_rates = 0;
> +    params->sample_rates = NULL;
> +
> +    char *p = strtok(tmp, " ,");
> +
> +    while (p != NULL) {
> +        params->sample_rates = realloc(params->sample_rates,
> +                                       sizeof(*params->sample_rates) *
> +                                       (params->num_sample_rates + 1));

This is problematic. You need to check if realloc returns NULL before
overwriting sample_rates.

It is also a bit expensive to realloc 1 element at a time. Is is
possible to know the size before hand? If not, then fine.

Please use libxl__realloc instead. We have quite a few wrappers in
libxl. In general please use them unless you have very compelling reason
not to.

There could be other places in your two series that I missed, please fix
them.

Wei.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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