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

Re: [Xen-devel] [PATCH V4 3/7] libxl: add pvusb API



Chunyan Liu writes ("[Xen-devel] [PATCH V4 3/7] libxl: add pvusb API"):
> Add pvusb APIs, including:
...

Thanks for your contribution.  I'm afraid I haven't had time to
completely finish my review this, but here's what I have:

> --- /dev/null
> +++ b/docs/misc/pvusb.txt
> @@ -0,0 +1,243 @@
> +1. Overview

It's good that you have provided documentation.  But I think this
document is a bit confused about its audience.

Information about design choices should be removed from this user- and
application-facing document, and put in comments in the code, or
commit messages, I think.


> +int libxl_device_usbctrl_getinfo(libxl_ctx *ctx, uint32_t domid,
> +                                libxl_device_usbctrl *usbctrl,
> +                                libxl_usbctrlinfo *usbctrlinfo)
> +                                LIBXL_EXTERNAL_CALLERS_ONLY;

Why is this function marked LIBXL_EXTERNAL_CALLERS_ONLY ?

> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index ef7aa1d..89a9f07 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -2439,6 +2439,18 @@ _hidden void libxl__device_vtpm_add(libxl__egc *egc, 
> uint32_t domid,
...
> +/* AO operation to connect a PVUSB controller.
> + * Adding a PVUSB controller will add a 'vusb' device entry in xenstore,
> + * and will wait for device connection.

In this context I think "will wait for device connection" is
misleading.  What you mean is that the vusb is available for adding
devices to, but won't have any yet.  Nothing in libxl is "waiting".

> diff --git a/tools/libxl/libxl_pvusb.c b/tools/libxl/libxl_pvusb.c
> new file mode 100644
> index 0000000..a6e1aa1
> --- /dev/null
> +++ b/tools/libxl/libxl_pvusb.c
> @@ -0,0 +1,1249 @@
...
> +void libxl__device_usbctrl_add(libxl__egc *egc, uint32_t domid,
> +                               libxl_device_usbctrl *usbctrl,
> +                               libxl__ao_device *aodev)
> +{
> +    STATE_AO_GC(aodev->ao);
...
> +    libxl_domain_config_init(&d_config);
> +    libxl_device_usbctrl_init(&usbctrl_saved);
> +    libxl_device_usbctrl_copy(CTX, &usbctrl_saved, usbctrl);

Wei will need to review the saved/live saved device info handling, and
the json, etc.

> +static int
> +libxl_device_usbctrl_remove_common(libxl_ctx *ctx, uint32_t domid,
> +                                   libxl_device_usbctrl *usbctrl,
> +                                   const libxl_asyncop_how *ao_how,
> +                                   int force)

As discussed, you mustn't call this within libxl.  If you need to, you
need to break it out into an internal function
(libxl__initiate_device_usbctrl_remove, maybe) which makes a callback
when done.

> +libxl_device_usbctrl *
> +libxl_device_usbctrl_list(libxl_ctx *ctx, uint32_t domid, int *num)
> +{
> +    GC_INIT(ctx);
> +    libxl_device_usbctrl *usbctrls = NULL;
> +    char *fe_path = NULL;
> +    char **dir = NULL;
> +    unsigned int ndirs = 0;
> +
> +    *num = 0;
> +
> +    fe_path = GCSPRINTF("%s/device/vusb",
> +                        libxl__xs_get_dompath(gc, domid));
> +    dir = libxl__xs_directory(gc, XBT_NULL, fe_path, &ndirs);
> +
> +    if (dir && ndirs) {
> +        usbctrls = malloc(sizeof(*usbctrls) * ndirs);

Please use libxl__calloc with NOGC.

> +        libxl_device_usbctrl* usbctrl;
> +        libxl_device_usbctrl* end = usbctrls + ndirs;
> +        for (usbctrl = usbctrls; usbctrl < end; usbctrl++, dir++, (*num)++) {
> +            char *tmp;
> +            const char *be_path = libxl__xs_read(gc, XBT_NULL,
> +                                    GCSPRINTF("%s/%s/backend", fe_path, 
> *dir));
> +
> +            libxl_device_usbctrl_init(usbctrl);
> +            usbctrl->devid = atoi(*dir);

This function (and the corresponding writing code) is quite formulaic.
Perhaps a macro or something could be used.

I would make a similar criticism of libxl_device_usbctrl_getinfo.

> +/* check if USB device is already assigned to a domain */
> +static bool is_usb_assigned(libxl__gc *gc, libxl_device_usb *usb)
> +{
> +    libxl_device_usb *usbs;
> +    int rc, num;
> +
> +    rc = libxl__device_usb_assigned_list(gc, &usbs, &num);
> +    if (rc) {
> +        LOG(ERROR, "Fail to get assigned usb list");
> +        return true;

I don't think this is proper error handling.  You need to either
encode the boolean return value in the error code, or have the boolean
result be a reference parameter.


Thanks,
Ian.

_______________________________________________
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®.